WINDOWS環境下PC機與單片機的通信

2021-01-06 電子產品世界

在自動控制系統中,PC機與單片機組成上位機和下位機,其基本構成是:下位機(單片機系統)完成信號檢測、A/D轉換和簡單的控制功能,通過系統總線(如RS-232、RS-485、USB)與上位機(PC機)相連,進行監測、控制,形成主從式結構。下面就上位機和下位機之間目前幾種常用的通訊方法作一些介紹。

本文引用地址:http://www.eepw.com.cn/article/171749.htm

1、RS-232的串行通訊

在工業控制中,串口是常用的計算機與外部串行設備之間的數據傳輸通道,由於串行通信方便易行,成本低,且完全能滿足要求,所以應用廣泛。

1.1、利用VC++的標準通信函數

利用VC++的標準通信函數_inp和_outp可實現串口通信。下面是一個串口初始化的程序:
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為簡化Windows下串行通信編程而提供的ActiveX控制項。它提供了一系列標準通信命令的使用接口,利用它可以建立與串口的連接,並可以通過串口連接到其他通信設備(如數據機),發出命令,交換數據以及監視和響應串行連接中發生的事件和錯誤。MSCOMM控制項可用於創建電話撥號程序、串口通信程序和功能完備的終端程序。

串行通信控制項MSComm32.OCX提供了使用RS-232來進行數據通信的所有協議,VC程式語言為該控制項提供了標準的事件處理函數、過程,並通過屬性和方法提供了串行通信的設置。它使用戶能夠方便地訪問Windows串行通信驅動程序的大多數特性,包括輸入、輸出緩衝區的大小及決定何時使用流控制命令掛起數據傳輸等。

在ClassWizard中為新創建的通信控制項定義成員對象(CMSComm m_Serial),通過該對象便可以對串口屬性進行設置,MSComm控制項共有27個屬性。如果需要通過多個串行口與多臺設備通信,那麼每一個串行口對應於一個單獨的MSComm控制項。串行口的設置參數既可以在對話框編輯器裡設定,也可以在程序代碼中通過調用CMSComm類的成員函數設定。例如,我們可以在MyCOMDlg類的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
}

打開所需串口後,我們需要考慮串口通信的時機。在接收或發送數據過程中,可能需要監視並響應一些事件和錯誤,所以事件驅動是處理串行埠交互作用的一種非常有效的方法。使用OnComm事件和CommEvent屬性捕捉並檢查通信事件和錯誤的值。發生通信事件或錯誤時將觸發OnComm事件,CommEvent屬性的值將被改變,應用程式通過檢查CommEvent屬性值並做出相應的反應。

如圖1是PC機與多個單片機連接的原理圖,圖2是其通信程序流程圖。

1.3、使用API函數

Windows 應用程式要與標準串口通信,Windows函數庫中提供了24個低級函數,這些函數為與外部設備的通信提供了基本的工具,文件輸入和文件輸出函數為通信資源句柄的打開、關閉以及執行讀寫操作提供了基本的接口,Win32 API也包含一系列訪問通信資源的通信函數,具體工作過程如下:首先打開一個通信資源句柄CreateFile(),接著進行串行通信資源的配置(包括波特率、奇偶校驗、停止位和數據位等信息),通過SetCommState()、GetCommState()進行修改和查詢完成初始化設置;串行通信資源的讀寫通過ReadFile()、WriteFile()來完成收發數據,監視串行通信資源某些可能發生的事件可通過WaitCommEvent()來完成,向與某通信資源相關的設備驅動程序發送控制命令,使驅動程序執行特定任務。

控制項雖然簡單易用,但由於必須拿到對話框中使用,在一些需要在線程中實現通信的應用場合下,控制項的使用顯得捉襟見肘。API是附帶在Windows內部的一個極其重要的組成部分。Windows的32位API主要是一系列很複雜的函數和消息集合。它可以看作是Windows系統為在其下運行的各種開發系統提供的開放式通用功能增強接口。通信程序在CreateFile處指定串口設備及相關的操作屬性,再返回一個句柄,該句柄將被用於後續的通信操作,並貫穿整個通信過程。串口打開後,其屬性被設置為默認值,根據具體需要,通過調用GetCommState(hComm,dcb)讀取當前串口設備控制塊DCB設置,修改後通過 SetCommState(hComm,dcb)將其寫入。運用ReadFile()與WriteFile()這兩個API函數實現串口讀寫操作,若為異步通信方式,兩函數中最後一個參數為指向OVERLAPPED結構的非空指針,在讀寫函數返回值為FALSE的情況下,調用 GetLastError()函數,返回值為ERROR_IO_PENDING,表明I/O操作懸掛,即操作轉入後臺繼續執行。此時,可以用 WaitForSingleObject()來等待結束信號並設置最長等待時間,舉例如下:
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、多線程下的串行通信

Windows內部的搶先調度程序在活動的線程之間分配CPU時間,Windows區分兩種不同類型的線程,一種是用戶界面線程(User Interface Thread),它包含消息循環或消息泵,用於處理接收到的消息;另一種是工作線程(Work Thread),它沒有消息循環,用於執行後臺任務、監視串口事件的線程即為工作線程。多線程程序的編寫在埠的配置、連接部分與單線程的相同,在埠配置完畢後,最重要的是根據實際情況,建立多線程之間的同步對象,如信號燈、臨界區和事件等。多線程的實現可以使得各埠獨立,準確地實現串行通信,使串行通信具有更廣泛的靈活性與嚴格性,且充分利用CPU時間。但在具體的實時監控系統中如何協調多個線程、線程之間以何種方式實現同步,這是多線程串行通信程序實現的難點。

相關焦點

  • Linux下ARM 和單片機的串口通信設計
    摘要:介紹Linux環境下串口通信的設計方法和步驟,並介紹了ARM9微處理器s3c2440在Linux下和C8051Fxxx系列單片機進行串行通信的設計方法,給出了硬體連接和通信程序流程圖。該方法可靠、實用,適用於大多數LinuxARM和單片機串口通信的場合。
  • STC89C52單片機通過HC06藍牙模塊與Android手機通信
    一環境: 1、任意單片機開發板即可(當時用的晶片STC90C516RD+),約定為下位機2、無線藍牙串口透傳模塊HC-06從機3、windows xp作業系統 4、
  • 不同單片機之間的通信方式
    這是一種佔用口線少,有效、可靠的通信方式;但遺憾的是許多小型單片機沒有硬體  UART,有些也只有1個UART,如果系統還要與上位機通信的話,硬體資源是不夠的。這種方法一般用於單片機有應件UART且不需與外界進行串行通信或採用雙UART單片機的場合。
  • 單片機之間UART通信示意圖分享
    單片機簡介   單片機是一種集成電路晶片。它採用超大規模技術將具有數據處理能力的微處理器(CPU)、存儲器(含程序存儲器ROM和數據存儲器RAM)、輸入、輸出接口電路(I/O接口)集成在同一塊晶片上,構成一個即小巧又很完善的計算機硬體系統,在單片機程序的控制下能準確、迅速、高效地完成程序設計者事先規定的任務。
  • 基於Modbus通信協議的eView觸控螢幕與51單片機的通信設計
    本文介紹了一種基於Modbus通信協議的eView觸控螢幕與常用的51單片機的通信方法。該方法通過C51編程實現Modbus通信,在51系列單片機上具有通用性,有一定的借鑑作用。 工業控制中經常需要觀察系統的運行狀態或者修改運行參數。觸控螢幕能夠直觀、生動地顯示運行參數和運行狀態,而且通過觸控螢幕畫面可以直接修改系統運行參數,人機互動性好。
  • 基於Matlab GUI的PC機與智能車的無線通信
    為了滿足對小車在賽道中各種狀態精確分析的需求,上位機的效據採集與處理要求通信波特率高、信號傳輸穩定、不丟包、數據處理量大、數據處理及時等。在基於Matlab環境下的串口通信中,查詢方式下的非實時串行通信技術對實時性要求很高的智能車通信有很大的局限性。而在目前普遍採用的中斷機制下的通信雖然可以滿足實時性的需要,卻需要修改Matlab自帶的instrcallback回調函數。
  • 基於單片機與PC通信的數據採集控制系統設計研究
    系統的基本組成  1. 1 系統的基本架構  文中構建的基於單片機與PC 通信的數據採集控制系統基本架構如圖1 所示:    圖1:系統基本架構框圖  如圖1 所示,被控對象通過傳感器的作用,採集到相應的數據,經過電壓轉換以及模擬/數字轉換之後,向單片機發送,單片機端可以根據數據採集的情況以及預先設置的程序
  • C8051F020單片機的RS485串行通信設計
    要實現單片機與計算機之間的RS485通信,一般可以採用2種方法:一種方法是在單片機與計算機兩端分別採用RS232與RS485電平轉換裝置;另一種方法是採用RS485通信卡,並將其插在計算機主板上。採用前一種方法的優點是硬體裝置安裝簡便,軟體編程相對簡單;缺點是通信速率被限制在20 kb/s以內。
  • 單片機必須了解的外設功能――GPIO/串行通信
    通過UART便可簡單地使用串行通信由於電特性的不同,以及用於進行通信協議的規定不同,串行通信具有多種方式,其中,最易於使用的應該是「異步通信模式」了。僅需用信號線將單片機和外圍設備連接起來便可使用,所以在單片機與動作監視器用的終端之間進行通信時、以及單片機與無線LAN用模塊進行通信時使用。
  • 基於RS485的組態王與單片機多機串口通信設計
    而單片機接口豐富,與A/D轉換模塊組合可以完成相同的工作,並且系統可靠、成本低。2 組態王與單片機的串口通訊方法目前,組態王與單片機的通信多是通過動態數據交換(DDE)或通過自己開發通訊驅動程序完成。DDE是Windows平臺上的一個完整的通信協 議,組態王通過該協議與其他應用程式交換數據。但不可靠和非實時。
  • 安卓手機與51單片機間藍牙通信的實現
    利用藍牙模塊建立手機和設備間的通信應用非常廣泛。藍牙耳機今天分享下如利用藍牙4.0模塊建立安卓手機和51單片機間的藍牙通信。(2)設置單片機的串口通信功能,因為藍牙模塊是通過單片機的串口與單片機連接的。串口通信部分看參看我上一篇文章,
  • LabVIEW與STC89C54單片機串口通信實現
    下位機主要是用來採集數據,可以通過嵌入式控制器、單片機控制器、PLC等來實現。上位機主要是圖形界面,用來實時顯示採集數據,並進行數據分析及處理,同時可以控制下位機。上位機的實現可以通過各種高級語言,比如VB、Delphi等以及NI公司的圖形化虛擬儀器軟體開發環境LabVIEW.由於LabVIEW採用的是圖形化的編程方法,所以無論你是否有過編程經驗,都可以快速、高效地設計用戶界面,實現與控制硬體的通信,並進行數據分析和處理。如今LabVIEW已經滲透到工業測量的各個領域,與此同時在嵌入式、FPGA、DSP、實時控制等領域也發揮著巨大的作用。
  • Java軟體與單片機串口通信
    從菜鳥級的電子愛好者到骨灰級的電子工程師,相信大多數人都經歷過製作萬年曆,畢竟它比較全面的考察對單片機基礎知識的掌握,並且體現了
  • 51單片機串口通信實例
    一、原理簡介本文引用地址:http://www.eepw.com.cn/article/170625.htm51 單片機內部有一個全雙工串行接口。什麼叫全雙工串口呢?
  • PL2303單片機串口轉USB口實現串行通信
    USB通信總線使用差分輸出驅動器來控制數據信號在USB電纜上的傳送,即通過控制D+和D-線從空閒狀態到相反的邏輯電平,實現原埠的數據包發送,數據包發送完以後,信號線(D+)和(D-)上的輸出驅動器均處於高阻狀態。2 單片機串口轉USB接口的電路 無論哪一款的單片機,其晶片上都有串行通信引腳TXD和RXD,利用這兩個引腳,通過某種接口晶片來實現串口轉USB口的電路。
  • 51 單片機UART 串口通信 方式1 實現
    1 51串行口結構51單片機的UART串行通信是基於其串行口的可編程硬體結構,只要用正確的程序代碼通過初始化串行口對應寄存器的形式將其串行硬體結構初始化,
  • Linux教程:在虛擬機中如何配置Linux系統網絡環境?
    但由於不是實體pc機,使用難免受限。如果配置不好,後期開發必受其累!比如,在很多程序中都要使用到資料庫!MySQL、Redis。與他們建立連接,尤其是遠程,必須要指明IP和埠。怎樣配置虛擬機可以讓windows 和 Linux 互聯,方便訪問外網而又不會頻繁變化呢?
  • 單片機RS485通信接口、控制線、原理圖及程序實例
    尤其當工業現場環境比較複雜,幹擾比較多時,採用差分方式可以有效的提高通信可靠性。RS485 採用兩根通信線,通常用 A 和 B 或者 D+和 D-來表示。邏輯「1」以兩線之間的電壓差為+(0.2~6)V 表示,邏輯「0」以兩線間的電壓差為-(0.2~6)V 來表示,是一種典型的差分通信。  RS485 通信速率快,最大傳輸速度可以達到 10Mb/s 以上。
  • labview實現PC與單片機之間的串口通信
    使用Proteus進行單片機仿真,仿真硬體連接,串口通信部分使用keil與labview,FF,十六進位)發送給單片機,單片機收到後回傳這個數字,PC接收到回傳數據後顯示出來,若發送的數據和接收到的數據相等,則串行通信正確,否則有錯誤。啟始符是數字00,結束符是數字FF。
  • 基於ZigBee的單片機無線通信系統實現
    隨著開源單片機系統開發平臺Arduino的普及,基於ZigBee協議標準的XBee系列產品也日漸流行。本文主要針對XBee產品系列中的XBee Pro ZB,探討了使用ZigBee協議進行單片機之間無線通信的方法。