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