laÄp trÌnh giao tieÁp noÁi tieÁp - khvt.com · trong ms dos ôû doøng leänh ñaùnh mode...

25
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å û a teâ n hay thay ño å i coå ng com tuø y yù .

Upload: others

Post on 06-Oct-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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ù.

Page 2: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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.

Page 3: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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”

Page 4: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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

Page 5: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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

Page 6: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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

Page 7: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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

Page 8: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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

Page 9: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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.

Page 10: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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()

Page 11: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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

Page 12: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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

Page 13: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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

Page 14: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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

Page 15: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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

Page 16: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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

Page 17: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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);

Page 18: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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();

Page 19: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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; }

Page 20: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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;

Page 21: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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;

Page 22: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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):

Page 23: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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);

Page 24: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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;

Page 25: LAÄP TRÌNH GIAO TIEÁP NOÁI TIEÁP - khvt.com · 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

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