使用MSCOMM32控件編寫串口程序
在此基礎(chǔ)上,我們看一個例子:
下面兩張圖 是一個 利用MsCom進行串口通訊(中斷方式)的程序框圖和回調(diào)VI的程序框圖
使用RTThrsehold屬性設(shè)置觸發(fā)接收中斷事件的觸發(fā)條件,本程序設(shè)置為1,當緩沖器接收到一個字符時,就會發(fā)生中斷事件——oncomm事件中斷,很多條件都可以產(chǎn)生oncomm事件,區(qū)分產(chǎn)生中斷的原因有Comevent的屬性值來確定,當conevent為2時,表示是由于接收到字符產(chǎn)生的中斷,由此進入接受中斷處理程序。
而中斷處理程序,接收到的數(shù)據(jù)是變體數(shù)據(jù),轉(zhuǎn)換為數(shù)組型數(shù)據(jù),發(fā)送數(shù)組中,最后送到返回變量中,供顯示和繪制實時圖使用。
commevent的參數(shù) 對比表!
根據(jù)應(yīng)用程序的用途和功能,在連接到其它設(shè)備過程中,以及接收或發(fā)送數(shù)據(jù)過程中,可能需要監(jiān)視并響應(yīng)一些事件和錯誤。 | ||
常數(shù) | 值 | 描述 |
ComEvSend | 1 | 發(fā)送緩沖區(qū)中的字符數(shù)少于SThreshold。 |
ComEvReceive | 2 | 接收到Rthreshold個字符。在使用Input屬性移去接收緩沖區(qū)中的數(shù)據(jù)之前,該事件將持續(xù)產(chǎn)生。 |
ComEvCTS | 3 | CTS信號發(fā)生變化。 |
ComEvDSR | 4 | DSR信號發(fā)生變化。該事件僅在DSR由1變?yōu)?時觸發(fā)。 |
ComEvCD | 5 | CD信號發(fā)生變化。 |
ComEvRing | 6 | 檢測到電話振鈴。某些UART(通用異步收發(fā)器)可能不支持本事件。 |
ComEvEOF | 7 | 收到文件結(jié)束符(ASCII字符26)。 |
下列錯誤同樣會觸發(fā)OnComm事件,并且在CommEvent屬性中寫入相應(yīng)的值。 | ||
| ||
設(shè)置值 | 值 | 描述 |
ComEventBreak | 1001 | 收到Break信號。 |
ComEventFrame | 1004 | 幀錯誤。硬件檢測到幀錯誤。 |
ComEventOverrun | 1006 | 端口超限。在下一個字符到達端口之前,前一字符還沒有從硬件中讀走,因而丟失。 |
ComEventRxOver | 1008 | 接收緩沖區(qū)溢出。接收緩沖區(qū)已沒有空間。 |
ComEventRxParity | 1009 | 奇偶校驗錯誤。硬件檢測到奇偶校驗錯誤。 |
comEventTxFull | 1010 | 發(fā)送緩沖區(qū)滿。在試圖將字符傳入發(fā)送緩沖區(qū)時,該緩沖區(qū)已滿。 |
ComEventDCB | 1011 | 在為端口獲取設(shè)備控制塊(DCB)時,發(fā)生不可預(yù)料的錯誤。 |
另外: 需要注意的是
如下圖所示:
U8類型數(shù)值的數(shù)組。
————————————————————————————————————————————————
關(guān)于RTThrsehold
例如 接收到的數(shù)據(jù)遠遠小于發(fā)送的數(shù)據(jù)了,接收到的數(shù)據(jù)出現(xiàn)亂碼了,等等。
經(jīng)過反復(fù)的實驗
我發(fā)現(xiàn) 如果將inputlen設(shè)置的過小(如1),同時呢,發(fā)送的波特率過高,就會出現(xiàn)接受到的數(shù)據(jù)小于實際發(fā)送出的數(shù)據(jù)。
因為將RTHrsehold設(shè)置為1的時候,每收到一個字符就會產(chǎn)生一次中斷,這次中斷會提取 inputlen個數(shù)的字符。
如果波特率過高,就會導(dǎo)致,中斷不能夠及時發(fā)生(每次中斷只讀取一個字符,而產(chǎn)生的中斷數(shù)目小于實際發(fā)送的字符數(shù)),很多數(shù)據(jù)到最后積累在緩沖區(qū)內(nèi)。
(這是我通過程序最后讀取緩沖區(qū)的數(shù)據(jù)大小進行的判斷)
因此必要時,可以將RTHrsehold和inputlen的值都設(shè)大一些,才能夠正常。(使得中斷處理函數(shù)的時間遠遠小于產(chǎn)生中斷的時間即可)
評論