Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
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
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
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.
Taùc giaû: TS Nguyeãn Ñöùc Thaønh Trang 212
http://www.khvt.com
Ñ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
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
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
Taùc giaû: TS Nguyeãn Ñöùc Thaønh Trang 214
http://www.khvt.com
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
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
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 XON/XOFF = 3 RTS/XON/XOFF Ví duï: Private Sub Form_Load ( )
Dim Buffer$ as string
Taùc giaû: TS Nguyeãn Ñöùc Thaønh Trang 216
http://www.khvt.com
‘ 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
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
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 383 Thuoäc tính chæ ñoïc comGetNotSupported 394 Thuoäc tính chæ ñoïc comPortOpen 8000 Khoâng thöïc hieän khi coång ñaõ môû 8001 Gía trò Timeout phaûi lôùn hôn 0 comPortInvalid 8002 Soá coång khoâng giaù trò 8003 Thuoäc tính chæ coù khi chöông trình chaïy 8004 Thuoäc tính chæ ñoïc khi chöông trình chaïy comPortAlreadyOpen 8005 Coång ñaõ môû roài 8006 Soá nhaän daïng thieát bò khoâng phuø hôïp 8007 Vaän toác truyeàn khoâng phuø hôïp 8008 Soá byte ñaõ ñaët khoâng giaù tri 8009 Thoâng soá maëc ñònh sai 8010 Thieát bò khoâng coù saün 8011 The function cannot allocate the queues comNoOpen 8012 Thieát bò khoâng môû 8013 Thieát bò ñaõ môû 8014 Could not enable comm notification comSetCommStateFailed 8015 Khoâng theå ñaët traïng thaùi truyeàn thoâng 8016 Khoâng theå ñaït maët naï che comPortNotOpen 8018 Hoaït ñoäng chæ thöïc hieän khi coång môû 8019 Thieát bò baän comReadError 8020 Error reading comm device comDCBError 8021 Internal error retrieving device control block for the port
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
Taùc giaû: TS Nguyeãn Ñöùc Thaønh Trang 218
http://www.khvt.com
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
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
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()
Taùc giaû: TS Nguyeãn Ñöùc Thaønh Trang 220
http://www.khvt.com
' 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
RXD : JNB RI,$
CLR RI
MOV A,SBUF
RET
LEDOFF: CJNE A,#30H,NEXT
MOV P0,#00000000B
ACALL SUB_TXD
SJMP INDEX
LED1: CJNE A,#31H,NEXT
CPL P0.0
ACALL SUB_TXD
SJMP INDEX
LED2: CJNE A,#32H,NEXT
CPL P0.1
ACALL SUB_TXD
SJMP INDEX
Chöông 8: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP Trang 221
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
LED3: CJNE A,#33H,NEXT
CPL P0.2
ACALL SUB_TXD
SJMP INDEX
LED4: CJNE A,#34H,NEXT
CPL P0.3
ACALL SUB_TXD
SJMP INDEX
LED5: CJNE A,#35H,NEXT
CPL P0.4
ACALL SUB_TXD
SJMP INDEX
LED6: CJNE A,#36H,NEXT
CPL P0.5
ACALL SUB_TXD
SJMP INDEX
LED7: CJNE A,#37H,NEXT
CPL P0.6
ACALL SUB_TXD
SJMP INDEX
NEXT: RET
TXD : MOV SBUF,#43
JNB TI,$
CLR TI
RET
END
Chöông trình maùy tính
Taùc giaû: TS Nguyeãn Ñöùc Thaønh Trang 222
http://www.khvt.com
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
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
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
Taùc giaû: TS Nguyeãn Ñöùc Thaønh Trang 224
http://www.khvt.com
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
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
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
Taùc giaû: TS Nguyeãn Ñöùc Thaønh Trang 226
http://www.khvt.com
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
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
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();
Taùc giaû: TS Nguyeãn Ñöùc Thaønh Trang 228
http://www.khvt.com
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); // Set big icon SetIcon(m_hIcon, FALSE); // 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
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
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;
Taùc giaû: TS Nguyeãn Ñöùc Thaønh Trang 230
http://www.khvt.com
datain.vt=VT_BSTR;
datain=m_ctlMSCOMM1.GetInput();
WideCharToMultiByte(CP_ACP,0,datain.bstrVal,-1,str,256,NULL,NULL);
return str;
}
Ngoaøi caùch söû duïng coâng cuï MSComm coøn coù theå duøng caùc
haøm cuûa WinAPI 32. Do tính chaát phöùc taïp cuûa caùc haøm vaø giôùi haïn cuûa giaùo
trình, xin trình baøy vaén taét ñeå aùp duïng vaøo chöông trình trong Delphi vaø VC. Chi tieát coù theå ñoïc trong Win 32 Program Reference. Sau ñaây laø caùc haøm
- Createfile, môû coång COM haøm naøy traû veà moät bieán (handle). Neáu khoâng môû coång ñöôïc, bieán traû veà laø –1, ñoùng coång duøng leänh closehandle, bieán traû veà laø khaùc zero, neáu traû veà zero laø coù loãi.
- Get Commstate: laáy caáu hình hieän taïi cuûa coång caát vaøo khoái DCB (device control block)
- Set Commstate: ñaët caáu hình coång theo noäi dung cuûa DCB - Purge Comm: xoùa boä ñeäm vaøo ra, chaám döùt ñoïc, vieát. - Writefile: vieát data (xuaát ra coång Com) - Readfile: ñoïc coång - EscapeCommFunction ñaët: vaø xoùa RTS hay DTR Unit modem: // chöông trình minh hoïa caùc leänh ñieàu khieån
modem duøng winapi vaø delphi 6.0 interface
uses Windows, SysUtils; Var parity, stopbit, databit, cong:byte; tdo: dword; v, d, ta, td: real; hPort : longint; Send: array [1..50] of char; Receive: array [1..100] of char; i, sobyte: integer; kq: byte;
Chöông 8: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP Trang 231
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
stri: string; Procedure Close_Com; Procedure Open_Com (nCom: byte); Procedure Set_Com (baud:Dword; Prt:byte; Stpbits:byte; dtbits: byte); Procedure Gan_chuoi (Str: string); Procedure Dial (phone: string); Procedure Hang_up; Procedure Flush_Com; Function Send_Com (send_str: string; dWByte: Dword): Boolean; Function Get_Com_Buffer: longint; Function Receive_Com (dwByte: Dword): Boolean; Procedure doi_chuoi (ch: byte); Implementation { $R *.DFM} Procedure Close_Com; begin if hPort <> –1 then CloseHandle (hPort); hPort := –1; end; Procedure Open_Com (nCom : byte); var sCom: string; begin sCom := ‘COM’ + IntToStr (nCom); if hPort <> –1 then Close Com; hPort := CreateFile (Pchar (sCom), GENERIC_READ OR GENERIC_WRITE, 0, NIL, OPEN_EXISTING; FILE_ATTRIBUTE_NORMAL, longint (0)); end; Procedure Set_Com(baud: Dword, Prt: byte; Stpbits:byte;dtbits: byte); var dcbPort:TDCB; // khai bao kieu DCB begin if hPort <> –1 then begin if GetCommState (hPort, dcbPort) then begin dcbPort. BaudRate:= baud; dcbPort. Bytesize: = dtBits; dcbPort. Parity : = prt; dcbPort.StopBits : = DtpBits; dcbPort. Elags : = dcbport.flags or (RTS_CONTROL_ENABLE) OR (DTR_CONTROL_ENABLE):
Taùc giaû: TS Nguyeãn Ñöùc Thaønh Trang 232
http://www.khvt.com
SetCommState (hPort, dcbPort); end; end; end; Procedure Gan_chuoi (Str : string); var i : byte; s: string; begin s:= Str; for i:= 1 to length (s) do send [i] := s [i]; end; Function Send_Com (send_str: string; dwByte: Dword): Boolean; var dwWritten: Dword; begin result:= strue; Gan_chuoi (send_str); if (hPort<> –1) then begin WriteFile (hPort, send, dwByte, dwWritten, nil); if dwWritten <>dwByte then begin result := false; exit; end; end else result := false; end; Procedure Flush_Com; begin if hPort <> –1 then // Loai bo cac ky tu trong in/out buffer PurgeComm (hPort, PURGE_RXABORT OR PURGE_TXABORT OR PURGE_RXCLEAR OR PURGE_TXCLEAR); end; Procedure Dial (phone : string); var s : string; begin Open_Com (cong); Set_Com (tdo, parity, stopbit, databit);
Chöông 8: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP Trang 233
Thaønh phoá Hoà Chí Minh, thaùng 4 naêm 2006
s := ‘ATDT’ + Phone+#13; Flush_Com; Send_Com (s, length (s)); end; Function Get_Com_Buffer : longint; var statPort : TCOMSTAT; dwErrorCode : dWord; begin Result := 0; if hPort <> –1 then begin
ClearCommError (hPort, dwErrorCode, @statPort); // Khoi phuc co bao loi
Result := statPort. CbInQue; // lay so byte trong in buffer end; end; Function Receive_Com (dwByte : Dword) : Boolean; Var dwRead : Dword; begin begin ReadFile (hPort, Receive, dwByte, dwRead, nil); if dwRead <> dwByte then begin result := false; exit; end else result := true; end; end; Procedure Hang_Up: var s : string; begin s := ‘ATH0’ +#13; Open_Com (cong); Set_Com (tdo, parity, stopbit, databit); Flush_Com; Send_Com (s, length (s)); Close_Com; end; Procedure doi_chuoi (ch : byte); var f : byte;
Taùc giaû: TS Nguyeãn Ñöùc Thaønh Trang 234
http://www.khvt.com
sbegin stri := ‘ ‘; for f := 1 to ch do begin if receive [j] = ‘Q’ then exit else Stri := Stri + receive [j]; end; end; END.
-------O------
Baøi taäp gôïi yù Vieát chöông trình giao tieáp PLC OMRON vaø SIEMENS