新聞中心

EEPW首頁(yè) > 測(cè)試測(cè)量 > 設(shè)計(jì)應(yīng)用 > 使用MSCOMM32控件編寫(xiě)串口程序

使用MSCOMM32控件編寫(xiě)串口程序

作者: 時(shí)間:2017-01-09 來(lái)源:網(wǎng)絡(luò) 收藏

本文引用地址:http://butianyuan.cn/article/201701/337119.htm

在此基礎(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ò)誤。
可以使用OnComm事件和CommEvent屬性捕捉并檢查通訊事件和錯(cuò)誤的值。
在發(fā)生通訊事件或錯(cuò)誤時(shí),將觸發(fā)OnComm事件,CommEvent屬性的值將被改變。因此,在發(fā)生OnComm事件的時(shí)候,如果有必要,可以檢查CommEvent屬性的值。由于通訊(特別是通過(guò)電話線的通訊)是不可預(yù)料的,捕捉這些事件和錯(cuò)誤將有助于使應(yīng)用程序?qū)@些情況作出相應(yīng)的反應(yīng)。
下表列出了可能觸發(fā)OnComm事件的通訊事件。對(duì)應(yīng)的值將在發(fā)生事件時(shí)被寫(xiě)入CommEvent屬性。

常數(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屬性中寫(xiě)入相應(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ū)滿(mǎn)。在試圖將字符傳入發(fā)送緩沖區(qū)時(shí),該緩沖區(qū)已滿(mǎn)。

ComEventDCB

1011

在為端口獲取設(shè)備控制塊(DCB)時(shí),發(fā)生不可預(yù)料的錯(cuò)誤。



另外: 需要注意的是 給output屬性賦值輸出時(shí),有兩種可用的形式:1是字符串 2是字節(jié)型數(shù)值 數(shù)組,就是占一個(gè)字節(jié)的數(shù)值組成的數(shù)組。然后轉(zhuǎn)化為變體數(shù)據(jù)類(lèi)型。

如下圖所示:


U8類(lèi)型數(shù)值的數(shù)組。

————————————————————————————————————————————————

關(guān)于RTThrsehold 和 inputlen的設(shè)置,我一直搞不明白,所以在實(shí)際應(yīng)用中出現(xiàn)過(guò)這樣那樣的問(wèn)題。

例如 接收到的數(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í)間即可)



上一頁(yè) 1 2 下一頁(yè)

關(guān)鍵詞: MSCOMM32控件串口程

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉