【正文】
hEvent As LongEnd TypeType SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As LongEnd TypeDeclare Function CloseHandle Lib kernel32 (ByVal hObject As Long) As LongDeclare Function GetLastError Lib kernel32 () As LongDeclare Function ReadFile Lib kernel32 (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Long) As LongDeclare Function WriteFile Lib kernel32 (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Long) As LongDeclare Function SetCommTimeouts Lib kernel32 (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As LongDeclare Function GetCommTimeouts Lib kernel32 (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As LongDeclare Function BuildCommDCB Lib kernel32 Alias BuildCommDCBA (ByVal lpDef As String, lpDCB As DCB) As LongDeclare Function SetCommState Lib kernel32 (ByVal hCommDev As Long, lpDCB As DCB) As LongDeclare Function CreateFile Lib kernel32 Alias CreateFileA (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As LongDeclare Function FlushFileBuffers Lib kernel32 (ByVal hFile As Long) As Long窗體模塊程序如下:39。2.屬性設(shè)置程序窗體、控件對象的主要屬性設(shè)置如表63所示。④ 添加兩個CommandButton控件,分別執(zhí)行發(fā)送字符、關(guān)閉程序等命令。圖64 程序窗體界面① 添加兩個TextBox控件,用于輸入要發(fā)送的字符和顯示需接收的字符。圖63 程序運(yùn)行界面 利用API函數(shù)實現(xiàn)字符型數(shù)據(jù)發(fā)送與接收1.建立新工程運(yùn)行VB,創(chuàng),作為發(fā)送和接收字符區(qū)的標(biāo)簽。如果聯(lián)網(wǎng)通信的另一臺計算機(jī)程序收到字符,則返回字符串,如“收到,我是第2組!”,如果通信正常該字符串將顯示在接收區(qū)中。兩臺計算機(jī)同時運(yùn)行本程序。停止程序運(yùn)行Private Sub Cmdquit_Click() Unload MeEnd Sub39。將緩沖區(qū)內(nèi)的數(shù)據(jù)讀入buf變量中 Case EvSend End Select = amp。 CTS 線的狀態(tài)發(fā)生變化 Case EvDSR 39。通過取代每一個 case 表達(dá)式來處理每個事件與錯誤 Case EvCD 39。只要 RThresold 中的設(shè)定字符數(shù)到達(dá)時便會使得 CommEvent 屬性值變成 EvReceive39。MSComm 的 OnComm 事件程序39。把字符通過串口發(fā)送出去39。接收緩沖區(qū)每收到一個字符都會使 MSComm 控件觸發(fā)OnComm 事件 = True 39。設(shè)置串口參數(shù) = 0 39。串口初始化Private Sub Form_Load() = 1 39。下面是利用事件方式編寫的PC與PC串口通信的參考程序,界面設(shè)計與圖62基本相同,區(qū)別是事件方式不需要時間控件。二是使用事件方式。應(yīng)用程序要使用串口進(jìn)行通信,必須在使用之前向操作系統(tǒng)提出資源申請要求(打開串口),通信完成后必須釋放資源(關(guān)閉串口)。 判斷緩沖區(qū)內(nèi)是否存在數(shù)據(jù) = + Chr(13) + Chr(10) + buf //回車換行 End IfEnd Sub39。 通過時鐘控制來自動接收字符Private Sub Timer1_Timer() Dim buf$ buf = Trim() 39。 打開通信端口1End Sub39。 設(shè)置串口1參數(shù) = 0 39。 串口初始化Private Sub Form_Load() = 1 39。可以使用計時器控件(Timer),該控件屬性中的Interval可以控制計時器被啟動的時間間隔,當(dāng)時間間隔一到,便會執(zhí)行原先放在計時器中的程序代碼。表62 窗體、控件對象的主要屬性設(shè)置控 件 類 型主 要 屬 性功 能Form(名稱) = COMForm窗體控件BorderStyle = 3運(yùn)行時窗體固定大小Caption = PC與PC串口通信窗體標(biāo)題欄顯示程序名稱Label(名稱) = Label1標(biāo)簽控件Caption = 顯示接收字符區(qū):標(biāo)簽文本Label(名稱) = Label2標(biāo)簽控件Caption = 輸入發(fā)送字符區(qū):標(biāo)簽文本TextBox(名稱) = Textsend文本框控件MultiLine = True允許多行顯示ScrollBars = 2Vertical垂直滾動條可用TextBox(名稱) = TextReceive文本框控件MultiLine = True允許多行顯示ScrollBars = 2Vertical垂直滾動條可用CommandButton(名稱) = Cmdsend按鈕控件Caption = 發(fā)送字符 手動發(fā)送字符MSComm(名稱) = MSComm1串口通信控件其他屬性在程序中設(shè)置Timer(名稱) = Timer1時鐘控件Enabled = True時鐘初始可用Interval = 500設(shè)置發(fā)送周期(ms)兩臺計算機(jī)中VB程序界面及屬性設(shè)置應(yīng)完全相同,尤其MSComm控件的InputMode和Settings屬性值應(yīng)相同。3.屬性設(shè)置從屬性窗口設(shè)置屬性時,只需從對象列表框中選擇待設(shè)置屬性的對象,然后從屬性列表的左列選擇屬性,最后在屬性列表的右列中輸入或選擇新的屬性值。(5)添加一個按鈕控件:Command1執(zhí)行發(fā)送字符命令。(3)添加兩個文本框控件:Text1 和Text2,用于輸入要發(fā)送的字符和顯示要接收的字符。圖62 程序窗體界面由于每個使用的MSComm控件對應(yīng)著一個串行端口,如果應(yīng)用程序需要訪問多個串行端口,必須添加多個MSComm控件。選擇“工程”菜單下的“部件…”子菜單,在彈出的“部件”對話框中,在“控件”選項卡屬性中選中“Microsoft Comm Control ”復(fù)選框,單擊“確定”按鈕后,在工具箱中就出現(xiàn)了一個形似“電話”的圖標(biāo),它就是MSComm控件。由于VB的串行通信組件并不會主動出現(xiàn)在工具箱里中,當(dāng)我們需要MSComm控件時,首先要把它加入到工具箱中。開始一個項目的設(shè)計時,VB的工具箱中會有許多默認(rèn)的控件讓設(shè)計者予以選用,這些原本就出現(xiàn)在工具箱中的控件是內(nèi)置控件,它提供了一些基本的系統(tǒng)設(shè)計組件給設(shè)計者,但功能比較特別的控件就不會出現(xiàn)在其中,如用來設(shè)計串口通信功能的控件MSComm就不在其中。運(yùn)行VB程序,出現(xiàn)“新建工程”對話框,選擇“標(biāo)準(zhǔn)EXE”,單擊“打開”命令按鈕,進(jìn)入VB工程集成開發(fā)環(huán)境,窗體設(shè)計器中自動出現(xiàn)一個名為Form1的空白窗體。 任務(wù)實現(xiàn) 利用MSComm控件實現(xiàn)字符型數(shù)據(jù)發(fā)送與接收1.建立新工程VB使用“工程”來管理每一個應(yīng)用程序要使用的所有文件,每建立一個新程序,就要新建一個工程。任務(wù)要求,兩臺計算機(jī)互發(fā)字符并自動接收,如一臺計算機(jī)輸入字符串“Please return abc123”,單擊“發(fā)送字符”命令,另一臺計算機(jī)若收到,就輸入字符串“abc123”,單擊“發(fā)送字符”命令,信息返回到第一組的計算機(jī)。表61 設(shè)計用軟、硬件序 號名 稱數(shù) 量1PC或IPC22串口通信線(三線制)13Visual Basic 1 PC與PC串口通信程序硬件線路圖線路說明,在計算機(jī)通電前,按圖61所示將兩臺PC通過串口線連接起來:計算機(jī)A串口COM1端口的TXD與計算機(jī)B串口COM1端口的RXD相連,計算機(jī)A串口COM1端口的RXD與計算機(jī)B串口COM1端口的TXD相連,計算機(jī)A串口COM1端口的GND與計算機(jī)B串口COM1端口的GND相連。(2)利用MSComm控件和API函數(shù)實現(xiàn)PC與PC串口通信的程序設(shè)計方法。本設(shè)計通過兩臺PC串口3線連接,介紹了利用API函數(shù)和MSComm控件設(shè)計串口通信程序的方法,包括字符與文件的發(fā)送與接收。在本章提供的串口通信程序設(shè)計中,除了PC與PC串口通信外,PC與單片機(jī)、PC與智能儀表、PC與PLC、PC與GSM短信模塊等串口通信任務(wù)的實現(xiàn)均采用MSComm控件。VB串口通信程序設(shè)計典型實例利用VB開發(fā)串口通信程序既可以使用MSComm控件也可以調(diào)用Windows API函數(shù)實現(xiàn)。不過,只要MSComm控件可以被選用,我們推薦選擇此控件實現(xiàn),因為MSComm控件的功能和API調(diào)用一樣強(qiáng),甚至比它還好且使用起來更加簡單。 PC與PC串口通信程序設(shè)計當(dāng)兩臺串口設(shè)備通信距離較近時,可以直接連接,最簡單的情況,在通信中只需3根線(發(fā)送線、接收線、信號地線)便可實現(xiàn)全雙工異步串行通信。 PC與PC串口通信程序設(shè)計目的(1)掌握PC與PC串口通信的線路連接方法。 PC與PC串口通信程序設(shè)計用軟、硬件本設(shè)計用到的硬件和軟件清單如表61所示。計算機(jī)B計算機(jī)A圖61 PC與PC串口通信線路 設(shè)計任務(wù)利用MSComm控件和VB API函數(shù)編寫程序?qū)崿F(xiàn)PC與PC串口通信。實際上就是編寫一個簡單的雙機(jī)聊天程序。一個工程由窗體、標(biāo)準(zhǔn)模塊、控件及應(yīng)用所需的開發(fā)環(huán)境設(shè)置等組成。2.程序界面設(shè)計向空白窗體添加各種控件,以完成預(yù)定的各種功能。(1)添加串口通信控件MSComm。讓MSComm控件出現(xiàn)在工具箱中的步驟如下。工具箱中有了MSComm控件,就可以選擇MSComm控件的圖標(biāo)后將其添加到程序窗體上,利用該控件編程,PC就可以通過VB實現(xiàn)與串口設(shè)備的串口通信了。(2)為了實現(xiàn)連續(xù)的自動接收,將工具箱中的Timer控件添加到程序窗體上。(4)添加兩個標(biāo)簽控件:Label1和Label2,作為發(fā)送和接收字符區(qū)的標(biāo)簽。程序設(shè)計界面如圖62所示。程序窗體、控件對象的主要屬性設(shè)置如表62所示。4.程序代碼設(shè)計程序要實現(xiàn)自動發(fā)送或讀取,在VB程序中有兩個方式可以達(dá)到,一是查詢方式,利用查詢事件是否發(fā)生,當(dāng)發(fā)生時,去執(zhí)行默認(rèn)的程序代碼。下面是利用查詢方式編寫的PC與PC串口通信的參考程序,代碼如下所示:39。 設(shè)置通信端口號為COM1 = 9600,n,8,1 39。 接收文本型數(shù)據(jù) = True 39。 把字符通過串口發(fā)送出去Private Sub Cmdsend_Click() If = Then pp = MsgBox(發(fā)送的數(shù)據(jù)不能為空!, 16) Exit Sub End If = Trim() For i = 1 To 20000000 Next iEnd Sub39。 將緩沖區(qū)內(nèi)的數(shù)據(jù)讀入buf變量中 If Len(buf) 0 Then 39。 關(guān)閉通信端口,停止程序運(yùn)行Private Sub Cmdquit_Click() = False Unload Me End Sub在Windows系統(tǒng)環(huán)境下,串口是系統(tǒng)資源的一部分。在Windows系統(tǒng)的系統(tǒng)函數(shù)中,均包含了支持通信中斷的功能。MSComm控件提供事件回應(yīng)功能,可以利用此功能達(dá)到自動發(fā)送/接收的目的。39。設(shè)置通信端口號為COM1 = 9600,n,8,1 39。接收文本型