WINDOWS環(huán)境下PC機與單片機的通信
在自動(dòng)控制系統中,PC機與單片機組成上位機和下位機,其基本構成是:下位機(單片機系統)完成信號檢測、A/D轉換和簡(jiǎn)單的控制功能,通過(guò)系統總線(xiàn)(如RS-232、RS-485、USB)與上位機(PC機)相連,進(jìn)行監測、控制,形成主從式結構。下面就上位機和下位機之間目前幾種常用的通訊方法作一些介紹。
本文引用地址:http://dyxdggzs.com/article/171749.htm1、RS-232的串行通訊
在工業(yè)控制中,串口是常用的計算機與外部串行設備之間的數據傳輸通道,由于串行通信方便易行,成本低,且完全能滿(mǎn)足要求,所以應用廣泛。
1.1、利用VC++的標準通信函數
利用VC++的標準通信函數_inp和_outp可實(shí)現串口通信。下面是一個(gè)串口初始化的程序:
Void init_com (PORT)
{char i;
outp(PORT+3,0x80);
outp(PORT,0x0C);
outp(PORT+1,0);
outp(PORT+3 ,0x3a);
outp(PORT+3 ,0x03);
i=inp(PORT+5) 0xfe;
outp(PORT+5,i);}
1.2、使用串行通信控件MSComm
MSCOMM控件,即Microsoft Communication Control,是Microsoft為簡(jiǎn)化Windows下串行通信編程而提供的ActiveX控件。它提供了一系列標準通信命令的使用接口,利用它可以建立與串口的連接,并可以通過(guò)串口連接到其他通信設備(如調制解調器),發(fā)出命令,交換數據以及監視和響應串行連接中發(fā)生的事件和錯誤。MSCOMM控件可用于創(chuàng )建電話(huà)撥號程序、串口通信程序和功能完備的終端程序。
串行通信控件MSComm32.OCX提供了使用RS-232來(lái)進(jìn)行數據通信的所有協(xié)議,VC編程語(yǔ)言為該控件提供了標準的事件處理函數、過(guò)程,并通過(guò)屬性和方法提供了串行通信的設置。它使用戶(hù)能夠方便地訪(fǎng)問(wèn)Windows串行通信驅動(dòng)程序的大多數特性,包括輸入、輸出緩沖區的大小及決定何時(shí)使用流控制命令掛起數據傳輸等。
在ClassWizard中為新創(chuàng )建的通信控件定義成員對象(CMSComm m_Serial),通過(guò)該對象便可以對串口屬性進(jìn)行設置,MSComm控件共有27個(gè)屬性。如果需要通過(guò)多個(gè)串行口與多臺設備通信,那么每一個(gè)串行口對應于一個(gè)單獨的MSComm控件。串行口的設置參數既可以在對話(huà)框編輯器里設定,也可以在程序代碼中通過(guò)調用CMSComm類(lèi)的成員函數設定。例如,我們可以在MyCOMDlg類(lèi)的OnInitDialog成員函數中初始化MSComm控件的參數,代碼如下:
BOOL CMyCOMDlg::OnInitDialog ()
{
CDialog::OnInitDialog ();
m_wndCOM1.SetCommPort(1);
m_wndCOM1.SetSettings(9600,e,7,1);
m_wndCOM1.SetRThreshold(1);
m_wndCOM1.SetSThreshold(0);
m_wndCOM1.SetInputLen(1);
m_wndCOM1.SetPortOpen(TRUE);
Return TRUE
}
打開(kāi)所需串口后,我們需要考慮串口通信的時(shí)機。在接收或發(fā)送數據過(guò)程中,可能需要監視并響應一些事件和錯誤,所以事件驅動(dòng)是處理串行端口交互作用的一種非常有效的方法。使用OnComm事件和CommEvent屬性捕捉并檢查通信事件和錯誤的值。發(fā)生通信事件或錯誤時(shí)將觸發(fā)OnComm事件,CommEvent屬性的值將被改變,應用程序通過(guò)檢查CommEvent屬性值并做出相應的反應。
如圖1是PC機與多個(gè)單片機連接的原理圖,圖2是其通信程序流程圖。
1.3、使用API函數
Windows 應用程序要與標準串口通信,Windows函數庫中提供了24個(gè)低級函數,這些函數為與外部設備的通信提供了基本的工具,文件輸入和文件輸出函數為通信資源句柄的打開(kāi)、關(guān)閉以及執行讀寫(xiě)操作提供了基本的接口,Win32 API也包含一系列訪(fǎng)問(wèn)通信資源的通信函數,具體工作過(guò)程如下:首先打開(kāi)一個(gè)通信資源句柄CreateFile(),接著(zhù)進(jìn)行串行通信資源的配置(包括波特率、奇偶校驗、停止位和數據位等信息),通過(guò)SetCommState()、GetCommState()進(jìn)行修改和查詢(xún)完成初始化設置;串行通信資源的讀寫(xiě)通過(guò)ReadFile()、WriteFile()來(lái)完成收發(fā)數據,監視串行通信資源某些可能發(fā)生的事件可通過(guò)WaitCommEvent()來(lái)完成,向與某通信資源相關(guān)的設備驅動(dòng)程序發(fā)送控制命令,使驅動(dòng)程序執行特定任務(wù)。
控件雖然簡(jiǎn)單易用,但由于必須拿到對話(huà)框中使用,在一些需要在線(xiàn)程中實(shí)現通信的應用場(chǎng)合下,控件的使用顯得捉襟見(jiàn)肘。API是附帶在Windows內部的一個(gè)極其重要的組成部分。Windows的32位API主要是一系列很復雜的函數和消息集合。它可以看作是Windows系統為在其下運行的各種開(kāi)發(fā)系統提供的開(kāi)放式通用功能增強接口。通信程序在CreateFile處指定串口設備及相關(guān)的操作屬性,再返回一個(gè)句柄,該句柄將被用于后續的通信操作,并貫穿整個(gè)通信過(guò)程。串口打開(kāi)后,其屬性被設置為默認值,根據具體需要,通過(guò)調用GetCommState(hComm,dcb)讀取當前串口設備控制塊DCB設置,修改后通過(guò) SetCommState(hComm,dcb)將其寫(xiě)入。運用ReadFile()與WriteFile()這兩個(gè)API函數實(shí)現串口讀寫(xiě)操作,若為異步通信方式,兩函數中最后一個(gè)參數為指向OVERLAPPED結構的非空指針,在讀寫(xiě)函數返回值為FALSE的情況下,調用 GetLastError()函數,返回值為ERROR_IO_PENDING,表明I/O操作懸掛,即操作轉入后臺繼續執行。此時(shí),可以用 WaitForSingleObject()來(lái)等待結束信號并設置最長(cháng)等待時(shí)間,舉例如下:
BOOL bReadStatus;
bReadStatus = ReadFile (m_hIDComDev, buffer,
dwBytesRead, dwBytesRead, m_OverlappedRead);
if (! bReadStatus){
if(GetLastError()==ERROR_IO_PENDING){
WaitForSingleObject(m_OverlappedRead.hEvent,1000);
return ((int)dwBytesRead);}
return(0);}
return ((int)dwBytesRead);
1.4、多線(xiàn)程下的串行通信
Windows內部的搶先調度程序在活動(dòng)的線(xiàn)程之間分配CPU時(shí)間,Windows區分兩種不同類(lèi)型的線(xiàn)程,一種是用戶(hù)界面線(xiàn)程(User Interface Thread),它包含消息循環(huán)或消息泵,用于處理接收到的消息;另一種是工作線(xiàn)程(Work Thread),它沒(méi)有消息循環(huán),用于執行后臺任務(wù)、監視串口事件的線(xiàn)程即為工作線(xiàn)程。多線(xiàn)程程序的編寫(xiě)在端口的配置、連接部分與單線(xiàn)程的相同,在端口配置完畢后,最重要的是根據實(shí)際情況,建立多線(xiàn)程之間的同步對象,如信號燈、臨界區和事件等。多線(xiàn)程的實(shí)現可以使得各端口獨立,準確地實(shí)現串行通信,使串行通信具有更廣泛的靈活性與嚴格性,且充分利用CPU時(shí)間。但在具體的實(shí)時(shí)監控系統中如何協(xié)調多個(gè)線(xiàn)程、線(xiàn)程之間以何種方式實(shí)現同步,這是多線(xiàn)程串行通信程序實(shí)現的難點(diǎn)。
數字通信相關(guān)文章:數字通信原理
通信相關(guān)文章:通信原理
評論