當(dāng)前位置:機(jī)電之家首頁 >> PLC技術(shù)>> PLC基礎(chǔ) >> PLC通信 >> 實(shí)現(xiàn)串行通信的查詢方法
實(shí)現(xiàn)串行通信的查詢方法


    Visual Basic是一個bbbbbbs系統(tǒng)下流行的應(yīng)用程序開發(fā)平臺。其方便的界面設(shè)計(jì)使程序員能節(jié)省大量時間,并把最大的精力集中在應(yīng)用程序核心代碼的編寫上。VB4目前已成為Win95系統(tǒng)下一種最高效靈活的主流開發(fā)工具之一,而調(diào)用API應(yīng)用程序接口則正是對VB4功能的強(qiáng)有力擴(kuò)充,它使得VB4能夠直接控制和處理PC硬件資源,而不必依賴于MS-DOS系統(tǒng)服務(wù)??梢哉f,正是借助于API使得VB即能隱藏大部分bbbbbbs編程的難點(diǎn),同時又提供了使用bbbbbbs環(huán)境的靈活性。

    因而在串行通信中使用調(diào)用API接口的方法是實(shí)現(xiàn)在VB中直接控制串行口硬件的簡便可行的解決方案。

一、關(guān)于Win95的多線程及32位API的描述

    微軟于95年推出的Win95操作系統(tǒng)是對其舊版本bbbbbbs性能的一次全面提升。它率先提出并實(shí)現(xiàn)了應(yīng)用程序多線程的編程思想,這是Win95系統(tǒng)區(qū)別于其他系統(tǒng)最顯著和最重要的特征之一。進(jìn)程是應(yīng)用程序的執(zhí)行實(shí)例,而線程則是進(jìn)程內(nèi)部執(zhí)行的路徑,從根本上說,線程是可由系統(tǒng)調(diào)度的一個最簡單的代碼單元,每個線程有自己的一組CPU寄存器和堆棧。Win95為每個獨(dú)立的線程安排一些CPU時間,操作系統(tǒng)以輪轉(zhuǎn)方式向線程提供時間片,這樣每個線程從外觀上看就象都在同時運(yùn)行一樣。一個多線程的應(yīng)用程序?qū)嶋H上在其內(nèi)部實(shí)現(xiàn)了多任務(wù)擴(kuò)展,為代碼賦予了并行執(zhí)行的特性。

    多線程應(yīng)用程序的主要優(yōu)勢就是可以用盡量少的時間對用戶的要求作出響應(yīng)。多線程并不代表代碼會運(yùn)行得更快,準(zhǔn)確地說,它僅僅意味著應(yīng)用程序可以更好地利用系統(tǒng)資源(調(diào)度機(jī)制、內(nèi)存和物理設(shè)備)。從而能建立一個非常靈活的應(yīng)用程序,它能隨時接收用戶輸入,并得到滿意的效果。

    因此為了在32位的Win95系統(tǒng)中建立更快速、可靠和健壯的代碼,多線程技術(shù)是必須掌握的關(guān)鍵技術(shù)之一。

    API(即應(yīng)用編程接口)是附帶在Win95內(nèi)部的一個極其重要的組成部分。Win95的32位API主要是一系列很復(fù)雜的函數(shù)、消息的集合。它可以看作是Win95系統(tǒng)為在其下運(yùn)行的各種開發(fā)系統(tǒng)提供的開放式通用功能增強(qiáng)接口。它使編程人員可以更容易地用不同類型的語言編制出運(yùn)行在Win95系統(tǒng)上的應(yīng)用程序。

    與bbbbbbs 3.x的16位API相比,附帶在Win95中的Win32 API是API質(zhì)量最顯著的一次提升。它正逐漸成為應(yīng)用廣泛的一種目標(biāo)平臺。Win32 API包括了1000多個API調(diào)用,加上API附帶的幾百種bbbbbbs常量、消息和數(shù)據(jù)類型結(jié)構(gòu),使用戶擁有了一系列用于Win95編程的復(fù)雜的而又有效的工具。

    API接口是對VB功能的最重要的擴(kuò)充。幾乎所有用VB的標(biāo)準(zhǔn)功能不能處理的問題都可以用調(diào)用API接口函數(shù)的方法來解決。API接口調(diào)用不僅給VB提供了大量可擴(kuò)充的功能強(qiáng)勁的函數(shù)。更為重要的是,它提供了一種最切實(shí)地?cái)U(kuò)充VB功能的思路和方法。尤其在一些直接和硬件交互的低級操作中,調(diào)用API接口函數(shù)往往是唯一的可行辦法。

    總之,調(diào)用API接口并結(jié)合多線程的編程技術(shù)已成了Win95環(huán)境下最流行的一種高級技術(shù)。大多數(shù)應(yīng)用程序的代碼都不得不涉及到這個高級專題。

二、Win95串行通信的工作機(jī)理

    常用的DOS系統(tǒng)主要是工作在響應(yīng)中斷方式。PC機(jī)串行通信程序大多利用其BIOS塊的INT14H中斷,以查詢串口的方式完成異步串行通信。

    與DOS響應(yīng)中斷的工作方式不同,bbbbbbs是一個事件驅(qū)動的,并與設(shè)備無關(guān)的多用戶操作系統(tǒng)。同時bbbbbbs禁止應(yīng)用程序直接和硬件交互,程序員只能通過bbbbbbs提供的各類驅(qū)動程序來管理硬件。在這種情況下,bbbbbbs系統(tǒng)充當(dāng)了應(yīng)用程序與硬件之間的中介。

    bbbbbbs系統(tǒng)函數(shù)即包含了通信支持中斷功能。Win95系統(tǒng)為每個通信設(shè)備開辟了用戶定義的輸入輸出緩沖區(qū)(即讀/寫緩沖區(qū)),數(shù)據(jù)進(jìn)出通信口均由系統(tǒng)后臺來完成。應(yīng)用程序只需完成對輸入輸出緩沖區(qū)操作就可以了。實(shí)際過程是每接收一個字符就產(chǎn)生一個低級硬件中斷,Win95系統(tǒng)中的串行驅(qū)動程序就取得了控制權(quán),并將接收到的字符放入輸入數(shù)據(jù)緩沖區(qū)。然后將控制權(quán)返還正在運(yùn)行的應(yīng)用程序。如果輸入緩沖區(qū)數(shù)據(jù)已滿,串行驅(qū)動程序用當(dāng)前定義的流控制機(jī)制通知發(fā)送方停止發(fā)送數(shù)據(jù)。隊(duì)列中的數(shù)據(jù)按“先進(jìn)先出”的次序處理。

    bbbbbbs 3.x提供了COMM.DRV驅(qū)動程序以支持串行通信,而Win95已對這些串行通信的標(biāo)準(zhǔn)函數(shù)作了改進(jìn)和標(biāo)準(zhǔn)化,并把對串口的支持與基本輸入輸出驅(qū)動程序集成為一體。Win95像對文件操作一樣來實(shí)現(xiàn)對串口的操作,兩者使用相同的打開、關(guān)閉及讀寫函數(shù)。

   以下是相應(yīng)的串行通信函數(shù)在16位和32位API中的比較:

    16位的API只提供了16個與通信相關(guān)的函數(shù)。與這些16位的通信函數(shù)相比,Win95提供的通信函數(shù)更為豐富,功能更為強(qiáng)大。

    在Win95系統(tǒng)中,串行口和串行通信驅(qū)動程序是通過一個數(shù)據(jù)結(jié)構(gòu)進(jìn)行配置的,這個數(shù)據(jù)結(jié)構(gòu)被稱為設(shè)備控制塊( Device Control Block ),簡稱DCB。Win95的DCB比bbbbbbs 3.x的DCB更復(fù)雜,對數(shù)據(jù)結(jié)構(gòu)的定義更完善。

    下面是Win95中設(shè)備控制塊數(shù)據(jù)結(jié)構(gòu)的定義:

Type DCB ’在Win95 API中有詳細(xì)定義,可從VB4的API Text Viewer中得到
DCBlength As Long
BaudRate As Long
fBinary As Long
fParity As Long
……
EvtChar As Byte
End Type
Win95為獲取通訊端口的狀態(tài)提供了重要的GetCommState函數(shù)。函數(shù)把端口的配置信息裝入一個設(shè)備控制塊DCB,從而獲得端口的配置情況。

另一個重要的COMSTAT結(jié)構(gòu)則通常被用來描述串口當(dāng)前的狀態(tài)。其定義如下:

Type COMSTAT ’在Win95 API中有詳細(xì)定義,可從VB4的API Text Viewer中得到
fCtsHold As Long
fDsrHold As Long
……
cbInQue As Long
cbOutQue As Long
End Type
通??砂匆韵滤牟綄?shí)現(xiàn)串行通信:

(1) 按協(xié)議的設(shè)置初始化并打開串行口,這樣做就是通知bbbbbbs本應(yīng)用程序需要這個串口,
并封鎖其他應(yīng)用程序使它們不能使用此串口。
(2) 配置這個串行口。
(3) 在串口上往返地傳輸數(shù)據(jù),并在傳輸過程中進(jìn)行校驗(yàn)。
(4) 不需要此串口時,關(guān)閉串口。即釋放串口以供其它應(yīng)用程序使用。
在這四個步驟中,主要的程序代碼集中在第(3)步。

三、VB串口查詢法的實(shí)現(xiàn)方法

(1)串口查詢法的機(jī)理

    VB的串口查詢法是一種主要工作在查詢方式下的實(shí)現(xiàn)方法。當(dāng)通信程序工作在“查詢”方式時,可以不考慮Win95的進(jìn)程和線程的問題。僅在串口有數(shù)據(jù)時,去讀串口緩沖區(qū)就可以了。這種方法下確定串口讀取的時機(jī)、握手協(xié)議及軟件糾錯的實(shí)現(xiàn)是程序員應(yīng)考慮的主要問題。
    由于這種方法主要工作在查詢方式。程序員必須完成相當(dāng)一部分通信狀態(tài)的檢測工作,許多細(xì)節(jié)(甚至包括通信過程中的字符屬性的轉(zhuǎn)換)也必須通過程序代碼完成。因而相比較通信控件方法而言,這種查詢方法對通信雙方協(xié)議的依賴性尤其大。雙方通信協(xié)議的約定對程序?qū)崿F(xiàn)的難易程度影響很大。

   串口查詢法中,一般串口初始化的流程如下:


    值得注意的一點(diǎn)是,此方法下協(xié)議的約定必須滿足以下條件:即甲方發(fā)送時,乙方必須在甲方發(fā)送動作之前進(jìn)入循環(huán)接收狀態(tài),直到接收到字符后通過對串口讀取函數(shù)ReadFile返回值的判斷跳出循環(huán)狀態(tài)。

同時,一般為了不使系統(tǒng)因循環(huán)等待接收而進(jìn)入“死循環(huán)”狀態(tài),可以人為設(shè)置讀取串口的循環(huán)次數(shù),一般1000~10000次即可。

VB4是一種極為靈活的高級語言,因而在這種方法下可以方便地引入?yún)R編語言的思維,利用其GoTo轉(zhuǎn)向語句方便地控制程序的流程。非常靈活方便。

(2)與通信線程法的比較

通信線程法通過在應(yīng)用程序的主線程外再創(chuàng)建一個通信線程來監(jiān)視通信設(shè)備,其最大優(yōu)點(diǎn)是程序?qū)邮諗?shù)據(jù)具有自主覺察能力。一旦通信線程查詢到數(shù)據(jù)已發(fā)送到串口上,線程自動向應(yīng)用程序發(fā)送一個數(shù)據(jù)接收到的消息,應(yīng)用程序可用該消息來讀取通信設(shè)備傳來的數(shù)據(jù)。并且使用通信線程還不占用CPU時間。這樣系統(tǒng)實(shí)際上具有了同時控制多個通信設(shè)備(如MODEM)的能力。

通信線程法在C++的開發(fā)系統(tǒng)中用得較多,這與C++的特點(diǎn)和優(yōu)勢密切相關(guān)。

由于VB自身的特點(diǎn),創(chuàng)建通信線程的方法對VB而言,實(shí)現(xiàn)上有相當(dāng)?shù)碾y度。而且這樣做,也無異于犧牲VB的簡單方便性而去遷就程序的復(fù)雜性,很不經(jīng)濟(jì)。串口查詢法容易地引入了匯編語言的一些思維,實(shí)現(xiàn)了最精簡的程序代碼。它不一定是最完善,但對一般VB程序員來說,這種方法確實(shí)達(dá)到了簡化思路和降低難度的目的。因而實(shí)現(xiàn)簡單。
四、串口查詢法的程序?qū)嵗?BR>
現(xiàn)約定甲方是PC機(jī),乙方是單片機(jī)系統(tǒng)(如電卡電度表系統(tǒng)的讀卡器)。通信格式設(shè)置為2400波特率,8位數(shù)據(jù)位,1位停止位,無奇偶校驗(yàn)。

下面是一個約定好通訊協(xié)議的程序?qū)嵗?BR>以下是甲方(PC機(jī))的幾個子函數(shù)的程序?qū)嵗?BR>Private Function OpenThePort(cPort as bbbbbb,cBaud as bbbbbb,cParity as bbbbbb,cData as bbbbbb,tStops as bbbbbb)As Boolean
Dim lResult as Long
Dim lHandle as Long
Dim DCB_COMM as DCB
Dim cDCBConfig as bbbbbb
lHandle = CreateFile(cPort,GENERIC_READ or GENERIC_WRITE,0&,0&,OPEN_EXISTING,0&,0&)
If lHandle = -1 Then ’打開串口失敗
OpenThePort = False
MsgBox “串口可能正被其他應(yīng)用程序占用!”
lResult = CloseHandle(lHandle) ’先關(guān)閉串口后再打開
If lResult = 0 Then
OpenThePort
Exit Function
End If
End If
cDCBConfig.band = 2400 ’設(shè)置DCB
cDCBConfig.parity = None
cDCBConfig.data = 8
cDCBConfig.stop = 1
lResult = BuildCommDCB(cDCBConfig,DCB_COMM) ’按用戶設(shè)定配置一個DCB結(jié)構(gòu)
If lResult = 0 Then
OpenThePort = False
MsgBox “無法建立DCB設(shè)備控制塊”
Exit Function
End If
lResult = SetCommState(lHandle,DCB_Comm) ’實(shí)際設(shè)置一個串口的DCB
If lResult = 0 Then
OpenThePort = False
MsgBox “無法建立DCB設(shè)備控制塊”
Exit Function
End If
OpenThePort = True
End Function

Private Sub SendHand ( ) ’發(fā)送握手信號的子過程
Dim Nchars As Long
Static Readbuff As bbbbbb * 1
Static Writebuff As bbbbbb * 1
Dim lpDCB As DCB
Dim lRet As Long
Dim lHandle As Long
Dim lpOverlapped As OVERLAPPED
Dim RNum As Integer

MsgBox “請把電卡讀卡器插在串口2上!”,48,“提示窗口”
lHandle = OpenThePort(COMM1,2400,None,8,1)
lRet = PurgeComm( lHandle,1 ) ’清輸出緩沖區(qū)
lRet = PurgeComm( lHandle,0 ) ’清輸入緩沖區(qū)
lRet = GetCommState ( lHandle,lpDCB ) ’獲得通訊口的狀態(tài)
Shand:
Writebuff$ = Chr$(&H8F)
lRet = WriteFile ( lHandle,Writebuff$,1,Nchars,lpOverlapped ) ’送握手信號入串口緩沖區(qū)
If lRet <= 0 Then
MsgBox “發(fā)送操作出錯,電卡握手信號未發(fā)送成功”, 16
GoTo Shand ’不成功則重發(fā)
Else
GoTo Qtest
End If
GoTo Shand
Qtest:
Readbuff$ =“ ” ’清除緩沖區(qū)為空
Do While lHandle ’循環(huán)查詢串口
RNum = 0 ’設(shè)置讀串口次數(shù)的指針為0
ReadAgain:
lRet = ReadFile( lHandle,Readbuff$,1,Nchars,lpOverlapped )
If lRet < 0 Then
MsgBox “讀取應(yīng)答信號時出錯”, 16
End If
If lRet = 0 Then
If RNum > 1000 Then ’只讀1000次串口,以免陷入死循環(huán)
MsgBox "電卡沒有插接好或電卡沒有接在串口上!"
GoTo CloseP
End If
RNum = RNum + 1
GoTo ReadAgain
End If
If Hex$(Asc(Readbuff)) <> Hex$(&HFF) Then
GoTo Shand ’回送碼不正確則返回繼續(xù)發(fā)送握手信號
Else
Label1.Caption = “握手信號是:”+Hex$(Asc(Readbuff$))
Msgbox “握手信號正確,已正確聯(lián)機(jī)”
GoTo CloseP
End If
Loop
CloseP: lRet = CloseHandle( lHandle )
If lRet = 0 Then
MsgBox “串行通訊口關(guān)閉成功”,48,“提示窗口”
End If
End Sub

    這里,要注意的是:當(dāng)PC機(jī)與單片機(jī)系統(tǒng)通信時,單片機(jī)數(shù)據(jù)存儲區(qū)( RAM )內(nèi)的數(shù)據(jù)是十六進(jìn)制,在信號線上傳輸?shù)氖鞘M(jìn)制數(shù)的ASCII碼的二進(jìn)制形式;而bbbbbbs系統(tǒng)下使用的是ANSI碼,ANSI碼僅在前126個與ASCII碼相同。即在Win95下接收到的是十六進(jìn)制數(shù)的ASCII碼的字符串,可先轉(zhuǎn)換為ANSI碼后再在Win95下還原為十六進(jìn)制數(shù)。

具體如下:Code$ = Hex$( Asc ( Readbuff$ ) )

   另外,由于32位API函數(shù)參數(shù)的數(shù)據(jù)類型的變化,所有整形參數(shù)都被換為長整型(Long)以支持32位的處理,這一點(diǎn)在設(shè)置返回值尤其如此。同時,這些API函數(shù)、類型及常量在調(diào)用之前,必須先聲明再使用。 
五、結(jié)束語
   由上可見,調(diào)用API接口的VB串口查詢法具有實(shí)現(xiàn)簡便、難度低、代碼精簡的突出優(yōu)點(diǎn)。很適合一般VB程序員在編寫通信程序時使用。
作者:未知 點(diǎn)擊:1687次 [打印] [關(guān)閉] [返回頂部]
本文標(biāo)簽:實(shí)現(xiàn)串行通信的查詢方法
* 由于無法獲得聯(lián)系方式等原因,本網(wǎng)使用的文字及圖片的作品報(bào)酬未能及時支付,在此深表歉意,請《實(shí)現(xiàn)串行通信的查詢方法》相關(guān)權(quán)利人與機(jī)電之家網(wǎng)取得聯(lián)系。
電子樣本

SN系列樣冊
:鞏經(jīng)理
:13915946763
:南京塞姆泵業(yè)有限公司
個人求購

楊異乾 【求購】  電涌保護(hù)器  2025-11-28
趙焱 【求購】  電氣溫控閥  2025-11-28
張揚(yáng)瓊 【求購】  ABB火檢...  2025-11-27
張雪根 【求購】  固體除垢劑  2025-11-26
趙經(jīng)理 【求購】  變壓器  2025-11-26
羅經(jīng)理 【求購】  巡邏車跟蹤...  2025-11-26
趙經(jīng)理 【求購】  柴油發(fā)電機(jī)  2025-11-26
沈雙 【求購】  柴油過濾紙  2025-11-26
VIP公司推薦