<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
關(guān) 閉

新聞中心

EEPW首頁(yè) > 工控自動(dòng)化 > 設計應用 > 用PComm開(kāi)發(fā)PC機與單片機的通信程序

用PComm開(kāi)發(fā)PC機與單片機的通信程序

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

摘要:介紹了分布式控制系統中上位與下位異步串行通信的通信協(xié)議;同時(shí)介紹了在VC++6.0環(huán)境下用PComm編寫(xiě)的通信程序來(lái)實(shí)現上位機和下位機異步串行通信的方法,給出了PComm編程實(shí)例和下位機程序模塊流程圖。 關(guān)鍵詞:分布式控制系統;異步;串行通信;PComm 在由一臺(上位機)和多臺(下位機)構成的分布式控制系統中,主要負責實(shí)時(shí)數據采集,并將初步處理后的數據通過(guò)串行口傳送給PC機以便由PC機串行口的命令對單片機進(jìn)行控制,同時(shí)通過(guò)打印機或顯示器向用戶(hù)隨時(shí)提供各種統計報表和整個(gè)控制過(guò)程的具體數據。在這樣的分布式控制系統中,單片機與微機之間的多路通信是整個(gè)系統的關(guān)鍵,本文將介紹在提高通信的準確性、可靠性和效率的前提下,用PC機與單片機的通信程序的解決方案。 1 通信協(xié)議 為了保證可靠的通信,必須有一套完善的通信協(xié)議。分布式控制系統中的每臺單片機均有唯一的番號。通信開(kāi)始時(shí),先由PC機呼叫被叫單片機的番號,單片機在接收到微機的呼叫后,首先判斷是不是自己的番號,如果是,則發(fā)送呼叫應答信號,否則不予理睬。微機在接收到呼叫應答信號之后,將向單片機發(fā)出通信命令字符串。以下是上位PC機協(xié)議的格式: 單片機號單片機號命令碼命令碼停止標志 其中,單片機號代表現場(chǎng)第幾臺單片機,占用1個(gè)字節,發(fā)送兩次的目的是為了防止干擾;命令碼則代表上位機向下位機發(fā)布的工作命令,它也占用1個(gè)字節,發(fā)送兩次的目的也是為了防止干擾。而停止標志則表明一次命令發(fā)送完畢。使用時(shí)可依據該標志判斷上位機的命令是否發(fā)送完畢。 下位機協(xié)議格式如下: 數據塊校驗位該格式中,數據塊為下位機上傳到上位PC機的數據。校驗位則用于PC機對收到的數據進(jìn)行奇偶校驗(占1個(gè)字節)。校驗正確后,可將數據寫(xiě)入內存,否則發(fā)出數據傳輸錯誤信息,以要求單片機重新傳輸數據。 另外,作為一個(gè)完整的通信協(xié)議,只有上述約定還不夠,還必須在發(fā)送和接收數據的時(shí)間間隔上加以限制。否則,很可能由于某些原因而造成無(wú)限制的等待對方應答,使整個(gè)系統處于工作不正常狀態(tài),或者延誤其它動(dòng)作的處理。具體時(shí)間限制可根據通信內容、CPU處理速度,再加上適當的余量來(lái)確定。 2 單片機通信程序設計

本文引用地址:http://dyxdggzs.com/article/201610/306775.htm
3.gif

設計單片機通信程序時(shí),必須充分發(fā)揮單片機的效率。由于單片機多應用于實(shí)時(shí)性較強的控制場(chǎng)合,因此,應將及時(shí)響應和控制對象的動(dòng)作放在優(yōu)先考慮的位置,以盡量減少通信等輔助性操作所占用的CPU時(shí)間?;谏鲜隹紤],筆者在設計單片機通信程序時(shí),將通信程序分為接收中斷處理程序、發(fā)送中斷處理程序和通信處理程序3部分,并將這3部分程序巧妙地進(jìn)行組合,從而構成整個(gè)單片機的通信程序。 2.1 接收中斷處理程序 接收中斷處理程序主要負責接收微機發(fā)送到單片機接收緩沖區(不對數據進(jìn)行處理,以減少中斷占用的時(shí)間)的數據,當接收到規定的字符數或在一定等待時(shí)間內無(wú)后續數據之后,置接收完畢標志,以表明接收緩沖區中有待處理的數據并請求通信處理程序對其進(jìn)行處理。其流程圖如圖1所示。 2.2 發(fā)送中斷處理程序 發(fā)送中斷處理程序主要負責向微機發(fā)送數據,發(fā)送中斷一般處于禁止狀態(tài),只有在通信處理程序將需要發(fā)送的數據寫(xiě)入單片機的發(fā)送緩沖區,并將發(fā)送中斷置為允許方式后,發(fā)送中斷才開(kāi)始工作,并將緩沖區數據逐一發(fā)送給微機。當發(fā)送完指定長(cháng)度的數據后(發(fā)送緩沖區為空),發(fā)送中斷處理程序將發(fā)送中斷置為禁止(關(guān)閉)狀態(tài),直到通信處理程序將其再一次開(kāi)放。其流程如圖2所示。 2.3 通信處理程序 考慮到盡量減少通信中斷程序所占用的CPU時(shí)間,通信處理程序被放在普通主循環(huán)中調用。只有在接收到上位機送來(lái)的一串數據,且接收完畢標志為“ON”時(shí),才能真正進(jìn)行處理,否則不進(jìn)行處理。這樣就可利用送信后等待微機回答的時(shí)間進(jìn)行別的處理,從而消除了空等待時(shí)間,提高了CPU的利用率。通信處理程序可根據通信處理狀態(tài)的不同來(lái)分別執行不同的路徑。在進(jìn)入相應路徑后,首先對接收緩沖區的內容進(jìn)行正確性檢查,檢查正確后再根據通信要求或協(xié)議規定對緩沖區的內容進(jìn)行處理(包括內存的寫(xiě)入和讀出),同時(shí)重新組織數據到發(fā)送緩沖區以向微機發(fā)送數據,最后退出通信處理程序以執行其它的程序。待接收中斷程序重新接收到數據并將接收完標志置為“ON”后,可重新進(jìn)入通信處理程序進(jìn)行處理。 3 PC機通信程序設計 在VC++6.0環(huán)境下,利用PC機串口進(jìn)行通信的常用方法有兩種第一是調用Windows APIAppli- cation Program Interface函數;第二是使用ActiveX的MSComm控件。第一種方法需聲明及調用許多API函數,十分煩瑣。而第二種方法是將API函數封裝起來(lái),這種方法雖較為簡(jiǎn)便,但不能滿(mǎn)足復雜情況下的通信要求。本文將介紹另外一種用PComm處理PC機的串口通信方法。 PComm是一種用于處理多進(jìn)程/多線(xiàn)程的串口通信軟件開(kāi)發(fā)工具,它提供了許多基于A(yíng)PI函數的命令集來(lái)處理串口通信,可以在Visual C++、Visual Basic、Delphi 5.0等多種開(kāi)發(fā)工具下使用,且具有傳輸速度快、使用靈活方便等特點(diǎn),能夠滿(mǎn)足復雜情況下的串口通信要求。 3.1 Pcomm的主要命令碼 PComm的主要命令碼有以下幾種: ● sio open(port); 用于設置并打開(kāi)串口,其中port的1、2、3、4分別代表COM1、COM2、COM3、COM4。當返回值為0時(shí),表示串口已經(jīng)打開(kāi),否則為串口打開(kāi)出錯。 ● sio close(port); 關(guān)閉串口,當返回值為0時(shí),表示串口已經(jīng)關(guān)閉,否則為串口關(guān)閉出錯。 ● sio ioctl(portbaudmode); 用于設置串口波特率、校驗位、數據位、停止位等參數。 ● sio getch(); 從串口輸入緩沖區讀出一個(gè)字符,返回值為0表示已收到數據。 ● sio-read(portbuflen); 用于從串口輸入緩沖區讀出一串字符,buf代表字符串數組len代表數組長(cháng)度,返回值為0表示未收到字符,大于0代表收到字符的個(gè)數。 ● sio-SetReadTimeoutsportTotalTimeouts(Inter-valTimeouts); 在設定的等待時(shí)間內連續讀串口輸入緩沖區,TotalTimeouts代表設定的等待時(shí)間,IntervalTimeouts代表每次讀出的間隔時(shí)間。 ● sio-flush(portfunc); 用于清空緩沖區。當func為0時(shí)清空輸入緩沖區,為1時(shí)清空輸出緩沖區,為2時(shí)清空輸入輸出緩沖區。 ● sio-putch(portterm); 用于向串口緩沖區發(fā)送一個(gè)字符,返回值為0時(shí)表示發(fā)送正確,否則表示發(fā)送錯誤。 ● sio-write(portbuflen); 用于從串口緩沖區發(fā)送一串字符,buf代表字符串數組,len代表數組長(cháng)度。 3.2 實(shí)現過(guò)程 在用Pcomm處理PC機的串口通信時(shí),其實(shí)現過(guò)程如下: (1)啟動(dòng)VC++ 6.0,新建一個(gè)基于對話(huà)框的應用程序TxRx。同時(shí)增加靜態(tài)文本、編輯框和按鈕控件,并為它們添加相應的變量。其屬性見(jiàn)表1。 表1 TxRx應用程序的屬性 控 件 ID 變量名類(lèi) 型 按 鈕 IDC_TRSMITT 發(fā)送按鈕  Edit IDC_TXDATA M_TxData Cstring Edit IDC_RXDATA M_RxData Cstring (2) 將Pcomm.h和Pcomm.lib加入到工程中,并在TxRxDlg.cpp文件中加入#include “Pcomm.h”頭文件,此后便可調用其提供的通信命令集。 (3)在TxRxDlg.cpp文件中添加有關(guān)程序代碼,也就是在OnInitiDialog函數中的TODO語(yǔ)句后加入以下代碼: //TODO Add extra initialization here int retport=1 ret=sio openport //打開(kāi)串口1 sio DTRport0 //置DTR為低電平 sio ioctlportB19200P NONE|BIT 8| STOP 1 //設置波特率為19200,8位數據位, 1位停止位,無(wú)校驗位。 3.3 數據通信 下面舉例說(shuō)明PC機如何通過(guò)串口向單片機發(fā)送并接收數據。 void CTXRXDlgSendRecv//收發(fā)數據子函數 {

4.gif

while1 { int ret1 sio flushport2;//清空串口輸入輸出緩沖區 sio- write(port,1,5); 向串口緩沖區發(fā)送5個(gè)字符 sio- SetReadTimeouts(port,40,1); //在40ms內每隔1ms讀一次串口 ret1=sio-read(port,RecvBuf,1); if (ret1>0) { sio- close(port); break; } //若收到數據,關(guān)閉串口,跳出循環(huán) else; //若未收到數據,對串口再一次發(fā)數據并再次查詢(xún)接收。 } } 4 結束語(yǔ) 本文給出了分布式控制系統中上位PC機與下位單片機之間進(jìn)行異步串行通信的解決方案。此方案在實(shí)際運行過(guò)程中,運行穩定,通信性能良好,從而較好地解決了上位機與下位機之間的通信問(wèn)題。



評論


相關(guān)推薦

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

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>