新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Windows環境下PC機與單片機串行通信的實現

        Windows環境下PC機與單片機串行通信的實現

        作者: 時間:2012-02-15 來源:網絡 收藏

        是計算機和外設進行通訊、對外設進行監控并獲取由外設采集到的監測數據的一個非常重要的手段。由于其所用的傳輸線少,成本低,起來方便易行,因而得到廣泛的應用。

        本文引用地址:http://www.104case.com/article/172102.htm

        以往在平臺上的多使用其提供的API函數來,這種方法使用起來需要許多底層設置,因而較為繁瑣,且難以理解。本文結合筆者在開發遙感CCD相機控制子系統的過程中對編程的一些經驗,介紹在32 b 操作系統下,用VisualC++6.0的ActiveX技術機與之間串行通信的一些方法。

        1 硬件組成

        系統中采用80C31作為下位機,機為上位機,二者通過RS232串行口接收或上傳數據。接線圖如圖1所示。

        由于RS232信號的電平為:

        25.jpg

        串口信號電平為TTL電平: 
          邏輯1為大于3.6 V; 
          邏輯0為小于0.3 V;

        26.jpg
          
        所以必須進行二者之間的電平轉換。在此使用集成電平轉換芯片MAX232來進行RS232C/TTL電平轉換。他使用單+5 V為其工作,配接4個1μF電解電容即可完成RS232電平與TTL電平之間的轉換。其原理圖如圖2所示。轉換完畢的串口信號TXD,RXD直接和 80C31的串行口連接。

        2 通信協議

        通信協議是指通信雙方的一種約定。在機與單片機通信中,PC機承擔主控任務,負責控制參數的設定,單片機接收PC機指令,并根據指令信息來上傳數據或控制被控對象。通信協議如下:

        采用RS232串口異步通信,1位起始位,8位數據位,1位停止位,無奇偶校驗位。波特率為9 600 b/s。傳輸數據采用二進制傳輸模式。以一個數據包為例,其幀頭字符“~”,字符值為7EH(十六進制),然后是數據串,幀尾是字符值為2A的“*”字符,則整個數據包為“~XXXX*”。其中“XXXX”就是已經約定好的指令碼。每個“X”表示一個十六進制數,如“~1AFF*”中“1A”表示命令下位機系統進行增益設置,而“FF”表示某個已經約定好的增益參數。下位機系統接收到此命令后,應立即向PC機回送應答命令,然后再進行相應的操作。如果在 1 s內PC機沒有收到應答,PC機再重發命令。根據通信協議,結合Visual C++6.0的特點,提出了如下的編程方法。

        27.jpg

        3 程序設計

        3.1 MSComm控件介紹

        MSComm(MicrosoftCommunication Control)控件,是Microsoft為簡化下串行通信編程而提供的ActiveX控件。在串口編程中其提供了2種處理通信問題的方法:一是事件驅動(Event-driven)法;一是查詢法。

        事件驅動通訊是處理串行端口交互作用的一種非常有效的方法。當通信事件發生時,MSComm控件會觸發OnComm事件,調用者可以捕獲該事件,通過檢查其CommEvent屬性便可確認發生的是哪種事件或錯誤,從而再做相應的處理。這種方法的優點是程序響應及時,可靠性高。

        查詢方式實質上還是事件驅動,但在有些情況下,這種方式顯得更為便捷。在程序的每個關鍵功能之后,可以通過檢查CommEvent屬性的值來查詢事件和錯誤。如果應用程序較小,并且是自保持的,這種方法可能是更可取的。例如,如果寫一個簡單的電話撥號程序,則沒有必要對每接收一個字符都產生事件,因為惟一等待接收的字符是調制解調器的“確定”響應。

        每個MSComm控件對應著一個串行端口,在使用MSComm控件時,1個MSComm控件只能同時對應1個串口。如果應用程序需要訪問多個串口,那么必須使用多個MSComm控件。

        MSComm控件有很多重要的屬性,其中常用的是如下幾個:
          (1)CommPort 設置并返回通信口號,缺省值為COM1,可設置1~16個。
          (2)SetStrings 設置并返回波特率、奇偶校驗、數據位、停止位的字符串。其中波特率的范圍為300~19 200 b/s。
          (3)PortOpen 設置并返回通信口的狀態,同時用來打開和關閉通信口。
          (4)InputLen 決定每次Input讀入的字符個數,缺省為0,表示讀取接收緩沖區的全部內容。
          (5)Input 讀入并清除接收緩沖區的字符。
          (6)InBufferCount 返回接收緩沖區已接收的字符數,通過置0可清除接收緩沖區。
          (7)Output 將發送的字符串或數組寫到發送緩沖區。
          (8)InputMode 定義Input屬性獲得數據的方式:0為文本;1為二進制。

        3.2 編程實現

        從MSComm控件屬性可以看出,MSComm可以以2種不同的形式接收數據,即以文本形式和以二進制形式。因為幾乎所有以單片機為核心的控制系統所傳輸的原始數據都是二進制形式的,因此本文主要討論在二進制形式下的使用方法。

        在VisualC++這種可視化界面中,采用基于對話框的應用程序,在對話框中插入MSComm控件后,根據通信協議,通過在主對話框的初始化函數OnInitDialog()中,加入如下代碼可以實現串口打開和屬性設置。

        28.jpg

        初始化后,接下來是對數據的發送與接收。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 高雄市| 珠海市| 商河县| 鄄城县| 什邡市| 奉化市| 西乌| 龙江县| 丽江市| 广东省| 长白| 龙江县| 德保县| 和林格尔县| 榆社县| 贺州市| 新蔡县| 平江县| 卢氏县| 贵港市| 偃师市| 南和县| 阿勒泰市| 沙雅县| 来凤县| 诏安县| 岳西县| 徐汇区| 历史| 大宁县| 溧水县| 克山县| 花莲市| 西乌珠穆沁旗| 高阳县| 白朗县| 山阳县| 渑池县| 宁强县| 西乌珠穆沁旗| 贺州市|