Bài giảng Đo lường và điều khiển bằng máy tính - Chương 8: Lập trình giao tiếp nối tiếp
Chöông
8
LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP
8.1 LAÄP TRÌNH TRONG DOS:
Ngoân ngöõ QBASIC
Leänh khôûi ñoäng coång COM n:
OPEN “COM n, [Baud], [Parity], [Data], [Stop]” for RANDOM
as #m trong ñoù n = 1, 2, 3, 4; m = 1 ÷ 255
Ví duï: OPEN “COM 2, 9600, E, 7, 2” FOR RANDOM AS #1
Leänh xuaát ra moät chuoãi S $
PRINT #1 , S $
Leänh ñoïc vaøo moät chuoãi R $
INPUT # 1, R $
Ngoaøi ra coøn caùc leänh truy xuaát thanh ghi cuûa vi maïch UART
Ngoân ngöõ Pascal vaø C
Duøng caùc leänh truy xuaát thanh ghi nhö ôû chöông 7
Trong MS DOS ôû doøng leänh ñaùnh
MODE COM n : 96, E, 7, 1 seõ môû COM n
8.2 LAÄP TRÌNH NGOÂN NGÖÕ VISUAL BASIC 6.0
Ngoân ngöõ Visual Basic coù module phaàn meàm MSCOMM.OCX
phuïc vuï cho truyeàn thoâng, vôùi Visual Basic 4.0 laø MSCOMM16.OCX
coøn vôùi Visual Basic 6.0 laø MSCOMM32.OCX
Muoán caøi trình ñôn truyeàn thoâng vaøo thanh coâng cuï ta vaøo
Project- Components – Controls choïn Microsoft Comm Control
6.0/ OK (Hình 8.1), bieåu töôïng hình ñieän thoaïi seõ hieän treân thanh
coâng cuï. Coù theå nhaép chuoät keùp ñeå ñöa vaøo form cuûa chöông
trình. Caùc böôùc treân coù theå laøm taét baèng phím Ctrl T. Thaønh
phaàn Comm khi môùi ñöa vaøo form thöôøng ñöôïc gaùn teân MSComm1
cho coång Com1 vaø ta coù theå söûa teân hay thay ñoåi coång com tuøy y.ù
Chöông 8: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP
Trang 211
Caùc tính chaát chính cuûa trình ñôn laø Commport, DTREnable,
EOFEnable, Handshaking, InBuffersize, InputLen, InputMode,
NullDiscard, OutBuffersize, ParityReplace, Rthreshold, RTSEnable,
Settmgs, Sthreshold… ñöôïc ñaët khi vieát chöông trình, coù theå thay
ñoåi khi chaïy chöông trình baèng caùc leänh ñieàu khieån.
Tính chaát CommPort
Ñaët coång com ñöôïc söû duïng
Object.CommPort [= Value]
Value = 1 ñeán 16, maëc ñònh laø 1 khi khôûi ñoäng Visual Basic.
Tính chaát naøy phaûi ñaët tröôùc khi môû coång, neáu bieåu thöùc
trong ngoaëc khoâng coù thì traû veà soá coång com ñang hoaït ñoäng.
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
Taùc giaû: TS Nguyeãn Ñöùc Thaønh
Trang 212
Ñaët caáu hình coång
Object.Settings [= Value]
Value = “BBBB, P, D, S”
Gía trò maëc ñònh laø “9600, N, 8, 1”. Trong tröôøng hôïp ñaët sai giaù
trò seõ baùo söï coá.
Sau ñaây laø caùc giaù trò cho pheùp:
•
•
Baud rate: 110, 300, 600, 1200, 2400, 9600 (Default), 14400,
19200, 28800, 38400, 56000, 128000, 256000
Parity bit: E (even), M (Mark), N (Default), O (odd), S
(Space)
•
•
Data bit: 4, 5, 6, 7, 8 (Default)
Stop bit: 1, 1.5, 2
Ví duï:
MSComm2. Settings = “9600, N, 8, 1”
Chöông 8: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP
Trang 213
Môû coång
Object.PortOpen [= True/ False]
Value = True : môû coång
Value = False : ñoùng coång vaø xoùa boä ñeäm truyeàn thu,
Coång töï ñoäng ñoùng khi keát thuùc chöông trình aùp duïng.
Nhaäp döõ lieäu
String$= Object.Input
Döõ lieäu chuoãi ôû boä ñeäm thu ñöôïc ñoïc vaøo bieán String$ . Lieân
quan ñeán ñoïc döõ lieäu coù caùc leänh sau:
Object.InputLen [= numByte%]
InputLen: qui ñònh soá kyù töï ñoïc bôûi Input. Choïn InputLen =
0 seõ cho ñoïc toaøn boä vuøng boä ñeäm.
Object.InbufferSize = [numbyte%]
InBufferSize ñaët vaø traû veà kích thöôùc theo byte cuûa ñeäm thu,
maëc ñònh laø 1024.
Object.InbufferCount [= Count%]
InbufferCount: cho bieát soá kyù hieäu coù trong boä ñeäm nhaän. Xoùa
boä ñeäm baèng caùch cho InbufferCount = 0
Object.InputMode [= value]
InputMode: cho bieát loaïi döõ lieäu laø vaên baûn hay nhò phaân
Value = 0 : ComInputModeText
Value = 1 : ComInputModeBinary
Ví duï:
Dim Buffer as Variant
Dim Arr() as Byte
MSComm1.CommPort = 1
MSComm1.PortOpen = True
‘Set InputMode to read binary data
MSComm1.InputMode = comInputModeBinary
Do Until MSComm1.InBufferCount > 10
DoEvents
Loop
Buffer = MSComm1.Input
' Assign to byte array for processing
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
Taùc giaû: TS Nguyeãn Ñöùc Thaønh
Trang 214
Arr = Buffer
Xuaát döõ lieäu
Object.Output [= value]
Xuaát chuoãi kyù töï hay chuoãi nhò phaân ra coång COM.
Gioáng nhö nhaäp döõ lieäu ta coù caùc leänh hoã trôï.
OutBufferSize: ñaët vaø traû laïi kích thöôùc boä ñeäm truyeàn
OutBufferCount: traû laïi soá kyù töï trong boä ñeäm truyeàn.
Ví duï: gôûi kyù töï nhaán phím
Private Sub Form_KeyPress (KeyAscii As Integer)
Dim Buffer as Variant
MSComm1.CommPort = 1
MSComm1.PortOpen = True
Buffer = Chr$(KeyAscii)
MSComm1.Output = Buffer
End Sub
Ví duï:
‘ gôûi chuoãi kyù töï
MsComm1.Output = "This is a text string”
‘ gôûi soá nhò phaân
Dim Out( ) As Byte
MsComm1.Output = Out
Gôûi tín hieäu Break
object.Break [= True/False]
Ñoïc chaân DCD
inCD= object. CDHolding
neáu inCD True thì DCD ôû möùc cao, neáu False DCD ôû möùc
thaáp.
Ñaët thôøi gian chôø soùng mang
object. CDTimeout [= milliseconds]
Chôø khoaûng thôøi gian cho DCD ôû möùc cao, neáu heát thôøi gian
maø CDHolding = false thì taïo söï kieän onComm CDTO (carrier
detect Timeout Error).
Ñoïc CTS
Chöông 8: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP
Trang 215
object. CTS Holding
True: möùc 1, False: möùc 0
Ñaët thôøi gian chôø CTS
Khi DTE gôûi RTS thì modem phaûi gôûi traû laïi CTS, tính chaát
object. CTSTimeout ñònh thôøi gian chôø, neáu quaù thôøi gian ñoù maø
khoâng coù CTS thì taïo söï kieän CTSTO.
Ñoïc DSR
object. DSRHolding
Ñaët thôøi gian chôø DSR
object. DSRTimeout
Ñieàu khieån DTR
object. DTREnable [=True/False] neáu True thì DTR möùc 1 khi
môû coång vaø möùc 0 khi ñoùng coång, neáu False thì DTR ôû möùc 0
Ñieàu khieån RTS
object. RTSEnable [ =True/False]
Khi True RTS seõ ôû möùc 1 khi môû coång vaø möùc 0 khi ñoùng
coång
Sthreshold: ñaët soá byte coù trong boä ñeäm truyeàn ñeå baùo söï kieän.
Neáu Sthreshold = 1 thì seõ goïi onComm khi boä ñeäm truyeàn
roãng.
Neáu Sthreshold = 0 thì khoâng goïi.
Ñaët soá byte cuûa boä ñeäm thu toái thieåu ñeå baùo söï kieän
object. Rthreshold [= value]
Neáu ñaët baèng 1 thì seõ goïi onComm khi nhaän ñöôïc 1 kyù töï.
Neáu ñaët baèng 0 thì khoâng goïi.
Giao thöùc baét tay
object.Handshaking [= value]
Value = 0 khoâng baét tay
Value = 1 baét tay theo RTS/CTS
= 2
= 3
XON/XOFF
RTS/XON/XOFF
Ví duï:
Private Sub Form_Load ( )
Dim Buffer$ as string
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
Taùc giaû: TS Nguyeãn Ñöùc Thaønh
Trang 216
‘ Duøng COM 1, 9600 baud, khoâng parity, 8 bit data, 1 bit stop
MSComm1. Comport = 1
MSComm1. Settings = “9600, N, 8, 1”
‘ Ñoïc toaøn boä boä ñeäm
MSComm1. Inputlen = 0
‘ Môû coång vaø gôûi leänh ñeán modem cheá ñoä traû lôøi baèng chöõ
MSComm1. PortOpen = True
MSComm1. Output = “ATV1Q0” & Chr$(13)
‘ Chôø traû lôøi “OK”, neáu coù OK thì ñoùng coång
Do
DoEvents
Buffer$ = Buffer$ & MSComm1. Input
Loop Until InStr (Buffer$, “OK” & vbCrLf)
MSComm1. PortOpen = False
End Sub
Chöông trình treân duøng kyõ thuaät hoûi voøng. Ta coù theå duøng kyõ
thuaät söï kieän object.CommEvent. Khi coù söï kieän xaûy ra chöông
trình cho coång object_OnComm () seõ ñöôïc goïi ñeå xöû lyù caùc söï kieän
hay caùc loãi.
Ví duï:
Private Sub MSComm1_OnComm ( )
Select Case MSComm1. CommEvent
‘ Xöû lyù söï kieän hay loãi baèng caùch ñaët leänh döôùi moãi phaùt bieåu Case
‘ Loãi
Case ComEventBreak ‘Nhaän Break
Case ComEventFrame ‘Sai frame
Case ComEventOverrun ‘Maát döõ lieäu
Case ComEventRXOver ‘Ñeäm thu traøn
Case ComEventRXParity ‘Sai Parity
Case ComEventTXFull ‘Ñeäm phaùt ñaày
Case ComEventDCB ‘Sai khi ñoïc DCB
‘ Söï kieän
Case ComEvCD ‘Ñöôøng CD thay ñoåi
Case ComEvCTS ‘CTS thay ñoåi
Case ComEvDSR ‘DSR thay ñoåi töø 1 xuoáng 0
Case ComEvRing ‘RI thay ñoåi
Case ComEvReceive ‘Soá byte ñeäm thu ñaït möùc Rthreshold
Case ComEvSend ‘Soá byte ñeäm phaùt ít hôn Sthreshold
Chöông 8: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP
Trang 217
Case ComEvEOF ‘Nhaän kyù töï EOF keát thuùc file (maõ ASCII 26) trong chuoãi nhaäp
End Select
End Sub.
Caùc loãi khi söû duïng MSComm trình baøy trong baûng sau
Loãi
Gía trò
Mieâu taû
comInvalidPropertyValue 380
Sai thuoäc tính
comSetNotSupported
comGetNotSupported
comPortOpen
383
394
Thuoäc tính chæ ñoïc
Thuoäc tính chæ ñoïc
Khoâng thöïc hieän khi coång ñaõ môû
Gía trò Timeout phaûi lôùn hôn 0
Soá coång khoâng giaù trò
Thuoäc tính chæ coù khi chöông trình chaïy
Thuoäc tính chæ ñoïc khi chöông trình chaïy
Coång ñaõ môû roài
Soá nhaän daïng thieát bò khoâng phuø hôïp
Vaän toác truyeàn khoâng phuø hôïp
Soá byte ñaõ ñaët khoâng giaù tri
Thoâng soá maëc ñònh sai
8000
8001
8002
8003
8004
8005
8006
8007
8008
8009
8010
8011
8012
8013
8014
comPortInvalid
comPortAlreadyOpen
Thieát bò khoâng coù saün
The function cannot allocate the queues
Thieát bò khoâng môû
comNoOpen
Thieát bò ñaõ môû
Could not enable comm notification
Khoâng theå ñaët traïng thaùi truyeàn thoâng
Khoâng theå ñaït maët naï che
comSetCommStateFailed 8015
8016
comPortNotOpen
8018
8019
8020
8021
Hoaït ñoäng chæ thöïc hieän khi coång môû
Thieát bò baän
Error reading comm device
Internal error retrieving device control block for the port
comReadError
comDCBError
Ví duï: chöông trình quay soá ñieän thoaïi qua modem
Option Explicit
' Variable names beginning with A through Z default to Integer.
DefInt A-Z
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
Taùc giaû: TS Nguyeãn Ñöùc Thaønh
Trang 218
Dim CancelFlag, Default$
Private Sub CancelButton_Click()
' CancelFlag tells the Dial procedure to exit.
CancelFlag = True
CancelButton.Enabled = False
End Sub
Private Sub Dial(Number$)
Dim DialString$, FromModem$, dummy, i As Double
i = 0
DialString$ = "ATDT" + Number$ + vbCr
' Dial the number.
MSComm1.Output = DialString$
' Wait for "OK" to come back from the modem.
Do
i = i + 1
dummy = DoEvents()
' If there is data in the buffer, then read it.
If MSComm1.InBufferCount Then
FromModem$ = FromModem$ + MSComm1.Input
' Check for "OK".
If InStr(FromModem$, "OK") Then
' Notify the user to pick up the phone.
Beep
MsgBox "Please pick up the phone and either press Enter or click OK"
Exit Do
End If
End If
' Did the user choose Cancel?
If i > 100000 Then
Beep
MsgBox "TimeOut, Please check cable and modem"
Exit Do
End If
If CancelFlag Then
CancelFlag = False
Exit Do
End If
Loop
' Disconnect the modem.
Chöông 8: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP
Trang 219
MSComm1.Output = "ATH" + vbCr
End Sub
Private Sub DialButton_Click()
Dim Number$, Temp$
DialButton.Enabled = False
QuitButton.Enabled = False
CancelButton.Enabled = True
' Get the number to dial.
Number$ = InputBox$("Enter phone number:", , Default$)
If Number$ = "" Then
DialButton.Enabled = True
QuitButton.Enabled = True
CancelButton.Enabled = False
Exit Sub
End If
Temp$ = Status
Default$ = Number$
Status = "Dialing - " + Number$
' Dial the selected phone number.
Dial Number$
DialButton.Enabled = True
QuitButton.Enabled = True
CancelButton.Enabled = False
Status = Temp$
End Sub
Private Sub Form_Load()
Default$ = "8654357"
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
On Error Resume Next
MSComm1.PortOpen = True
If Err Then
MsgBox "COM1: not available. Change the CommPort property to another port."
Exit Sub
End If
MSComm1.InBufferCount = 0
MSComm1.InputLen = 0
End Sub
Private Sub QuitButton_Click()
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
Taùc giaû: TS Nguyeãn Ñöùc Thaønh
Trang 220
' Close the port.
MSComm1.PortOpen = False
End
End Sub
Ví duï: gheùp noái vi ñieàu khieån 8951 ñieàu khieån port 0
ORG 0000H
MOV IE,#00000000B
MOV TMOD,#00100000
MOV TL1#,0FDH
MOV TH1,#0FDH
MOV SCON,#01010000B
SETB TR1
MOV P0,#00000000B
INDEX:
ACALL SUB_RXD
ACALL LEDOFF
ACALL LED1
ACALL LED2
ACALL LED3
ACALL LED4
ACALL LED5
ACALL LED6
ACALL LED7
SJMP INDEX
JNB RI,$
RXD :
CLR RI
MOV A,SBUF
RET
LEDOFF:
LED1:
CJNE A,#30H,NEXT
MOV P0,#00000000B
ACALL SUB_TXD
SJMP INDEX
CJNE A,#31H,NEXT
CPL P0.0
ACALL SUB_TXD
SJMP INDEX
CJNE A,#32H,NEXT
CPL P0.1
LED2:
ACALL SUB_TXD
SJMP INDEX
Chöông 8: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP
Trang 221
LED3:
LED4:
LED5:
LED6:
LED7:
CJNE A,#33H,NEXT
CPL P0.2
ACALL SUB_TXD
SJMP INDEX
CJNE A,#34H,NEXT
CPL P0.3
ACALL SUB_TXD
SJMP INDEX
CJNE A,#35H,NEXT
CPL P0.4
ACALL SUB_TXD
SJMP INDEX
CJNE A,#36H,NEXT
CPL P0.5
ACALL SUB_TXD
SJMP INDEX
CJNE A,#37H,NEXT
CPL P0.6
ACALL SUB_TXD
SJMP INDEX
RET
NEXT:
TXD :
MOV SBUF,#43
JNB TI,$
CLR TI
RET
END
Chöông trình maùy tính
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
Taùc giaû: TS Nguyeãn Ñöùc Thaønh
Trang 222
Private Sub Command8_Click() ‘ Communication Setting
On Error GoTo Errlabel
MSComm1.Settings = Text1.Text
MSComm1.CommPort = Combo1.ListIndex + 1
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
MSComm1.InputLen = 0
Exit Sub
Errlabel:
If Err.Number = 8002 Then MsgBox "Select com Port", vbInformation, "8051 Control I/O"
End Sub
Private Sub Command1_Click()
MSComm1.Output = "1"
valLED1 = Not valLED1
End Sub
Chöông 8: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP
Trang 223
Private Sub Command2_Click()
MSComm1.Output = "2"
valLED2 = Not valLED2
End Sub
Private Sub Command3_Click()
MSComm1.Output = "3"
valLED3 = Not valLED3
End Sub
Private Sub Command4_Click()
MSComm1.Output = "4"
valLED4 = Not valLED4
End Sub
Private Sub Command5_Click()
MSComm1.Output = "5"
valLED5 = Not valLED5
End Sub
Private Sub Command6_Click()
MSComm1.Output = "6"
valLED6 = Not valLED6
End Sub
Private Sub Command7_Click()
MSComm1.Output = "7"
valLED7 = Not valLED7
End Sub
Private Sub Command9_Click()
MSComm1.Output = "0"
valLED = Not valLED
End Sub
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
Dim Buffer As Variant
Buffer = MSComm1.Input
Label2.Caption = "Return = " & Buffer
If Buffer = "C" Then
If valLED = True Then
For x = 0 To 7 Step 1
Shape1(x).FillColor = &HFFFFFF
Next
Shape1(0).FillColor = &HFF&
valLED1 = False
valLED2 = False
valLED3 = False
valLED4 = False
valLED5 = False
valLED6 = False
valLED7 = False
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
Taùc giaû: TS Nguyeãn Ñöùc Thaønh
Trang 224
Command9.Caption = "ON ALL"
Exit Sub
Else
Shape1(0).FillColor = &HFFFFFF
Command9.Caption = "OFF ALL"
End If
If valLED1 = True Then
Shape1(1).FillColor = &HFF&
Else
Shape1(1).FillColor = &HFFFFFF
End If
If valLED2 = True Then
Shape1(2).FillColor = &HFF&
Else
Shape1(2).FillColor = &HFFFFFF
End If
If valLED3 = True Then
Shape1(3).FillColor = &HFF&
Else
Shape1(3).FillColor = &HFFFFFF
End If
If valLED4 = True Then
Shape1(4).FillColor = &HFF&
Else
Shape1(4).FillColor = &HFFFFFF
End If
If valLED5 = True Then
Shape1(5).FillColor = &HFF&
Else
Shape1(5).FillColor = &HFFFFFF
End If
If valLED6 = True Then
Shape1(6).FillColor = &HFF&
Else
Shape1(6).FillColor = &HFFFFFF
End If
If valLED7 = True Then
Shape1(7).FillColor = &HFF&
Else
Shape1(7).FillColor = &HFFFFFF
End If
End If
End Select
Errlabel:
Exit Sub
End Sub
Chöông 8: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP
Trang 225
8.3 LAÄP TRÌNH DUØNG DELPHI 5.0 VAØ VISUAL C++6.0
MSComm coù theå caøi trong Delphi theo caùc böôùc sau:
Vaøo menu Component – Import ActiveX Control -- Microft
Comm Control 6.0 – Install ñeå caøi MSComm vaøo ActiveX. Sau ñoù
vaøo toolbar ActiveX. tìm icon ñieän thoaïi ñeå keùo vaøo Form.
Caùc leänh MSComm trong Delphi töông töï trong Visual Basic
Ñoái vôùi Visual C thì laäp trình MSComm phöùc taïp hôn, sau
ñaây laø ví duï caøi ñaët MSComm trong Visual C
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
Taùc giaû: TS Nguyeãn Ñöùc Thaønh
Trang 226
Caøi ñaët MSCOMM trong Visual C
Neáu muoán theâm component truyeàn thoâng noái tieáp vaøo project
baïn vaøo menu Project- Add to Project- Components and Controls
Gallery
Choïn muïc Registered ActiveX Controls – Microsoft Communication
Controls, version 6.0- Insert. Hình bieåu töôïng ñieän thoaïi xuaát
hieän treân thanh Control.
Laäp trình MSCOMM trong Visual C++ phöùc taïp hôn laäp trình
trong Visual Basic vaø Delphi, caùc haøm cuûa lôùp CMScomm ñöôïc
ñònh nghóa trong mscomm.h, sau ñaây laø moät ñoaïn trong file naøy
caàn tham khaûo ñeå goïi haøm cho ñuùng
void SetCDHolding(BOOL bNewValue);
BOOL GetCDHolding();
void SetCommID(long nNewValue);
long GetCommID();
void SetCommPort(short nNewValue);
short GetCommPort();
void SetCTSHolding(BOOL bNewValue);
BOOL GetCTSHolding();
void SetDSRHolding(BOOL bNewValue);
BOOL GetDSRHolding();
void SetDTREnable(BOOL bNewValue);
Chöông 8: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP
Trang 227
BOOL GetDTREnable();
void SetHandshaking(long nNewValue);
long GetHandshaking();
void SetInBufferSize(short nNewValue);
short GetInBufferSize();
void SetInBufferCount(short nNewValue);
short GetInBufferCount();
void SetBreak(BOOL bNewValue);
BOOL GetBreak();
void SetInputLen(short nNewValue);
short GetInputLen();
void SetNullDiscard(BOOL bNewValue);
BOOL GetNullDiscard();
void SetOutBufferSize(short nNewValue);
short GetOutBufferSize();
void SetOutBufferCount(short nNewValue);
short GetOutBufferCount();
void SetParityReplace(LPCTSTR lpszNewValue);
CString GetParityReplace();
void SetPortOpen(BOOL bNewValue);
BOOL GetPortOpen();
void SetRThreshold(short nNewValue);
short GetRThreshold();
void SetRTSEnable(BOOL bNewValue);
BOOL GetRTSEnable();
void SetSettings(LPCTSTR lpszNewValue);
CString GetSettings();
void SetSThreshold(short nNewValue);
short GetSThreshold();
void SetOutput(const VARIANT& newValue);
VARIANT GetOutput();
void SetInput(const VARIANT& newValue);
VARIANT GetInput();
void SetCommEvent(short nNewValue);
short GetCommEvent();
void SetEOFEnable(BOOL bNewValue);
BOOL GetEOFEnable();
void SetInputMode(long nNewValue);
long GetInputMode();
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
Taùc giaû: TS Nguyeãn Ñöùc Thaønh
Trang 228
Ví duï muoán truyeàn chuoãi what ta duøng ñoaïn leänh sau
CString strOutput = "What";
UCHAR myData = 0x00;
strOutput += myData;
m_Comm.SetPortOpen(true); // môû coång
m_Comm.SetOutput(COleVariant(strOutput));
Sau ñaây trình baøy phaàn chính cuûa chöông trình serialDlg.cpp
giao tieáp qua coång Com, môøi caùc baïn phaân tích yù nghóa caùc doøng
leänh, ñeà nghò tham khaûo theâm höôùng daãn cuûa VC++
// serialDlg.cpp : implementation file
BOOL CSerialDlg::OnInitDialog()
{
CDialog::OnInitDialog();
SetIcon(m_hIcon, TRUE);
SetIcon(m_hIcon, FALSE);
// Set big icon
// Set small icon
if(m_ctlMSCOMM1.GetPortOpen()) m_ctlMSCOMM1.SetPortOpen(FALSE);
m_ctlMSCOMM1.SetCommPort(1); //ñaët caáu hình port
m_ctlMSCOMM1.SetSettings("9600,n,8,1");
m_ctlMSCOMM1.SetInputMode(0);
m_ctlMSCOMM1.SetRThreshold(1);
m_ctlMSCOMM1.SetSThreshold(0);
m_ctlMSCOMM1.SetInputLen(0);
m_ctlMSCOMM1.SetPortOpen(TRUE);
return TRUE;
}
Chöông 8: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP
Trang 229
void CSerialDlg::OnExit()
{
m_ctlMSCOMM1.SetPortOpen(FALSE);
OnOK();
}
void CSerialDlg::OnSend()
{
UpdateData(TRUE);
m_receive.Empty();
Send_str(m_send);
UpdateData(FALSE);
}
void CSerialDlg::Send_str(CString str)
{
LPCSTR pstr=str; //ñaët con troû cho chuoãi
int i = str.GetLength();
BSTR bstr = SysAllocStringLen(0,i); //daønh choã cho chuoãi Unicode bstr
MultiByteToWideChar(CP_ACP,0,pstr,i+1,bstr,i+1); //ñoåi sang maõ Unicode
VARIANT dataout;
dataout.vt=VT_BSTR;
dataout.bstrVal=bstr;
m_ctlMSCOMM1.SetOutput(dataout); //xuaát chuoãi ra
}
void CSerialDlg::OnMscomm1()
{
if(m_ctlMSCOMM1.GetCommEvent()==2)
{
m_receive +=Get_str();
UpdateData(FALSE);
}
. }
CString CSerialDlg::Get_str()
{
CHAR str[256];
VARIANT datain;
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
Tải về để xem bản đầy đủ
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Đo lường và điều khiển bằng máy tính - Chương 8: Lập trình giao tiếp nối tiếp", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
bai_giang_do_luong_va_dieu_khien_bang_may_tinh_chuong_8_lap.pdf

