Windows CE.NET 4.2下PC與單片機的串行通信
在工業(yè)控制中,常需要將單片機采集到的數據傳送給PC機處理、顯示,并且根據處理結果給單片機發(fā)送控制命令。串行通信雖然傳送速度相對較慢,但是傳送成本低,對實現監(jiān)視和控制,具有足夠的帶寬,并且沒有過于復雜的編解碼,實現自定義的協議也不復雜,因而在工業(yè)自動化、通信和軍事等領域的應用十分廣泛。隨著Windows CE嵌入式操作系統在工業(yè)控制中的廣泛應用,設計和實現Windows CE下PC與單片機的串行通信具有重要的意義。
本文引用地址:http://butianyuan.cn/article/171935.htmWindows CE 是一個面向移動計算和嵌入式應用的操作系統,其突出優(yōu)點是模塊化、可定制性、完備性、實時性、通信能力強大和基于Win32應用程序編程接口。 Windows CE.N ET 4.2是為嵌入式市場重新設計的Windows CE 3.0的后繼產品,為快速建立下一代智能移動和小內存占用的設備提供了一個健壯的實時操作系統。他包括創(chuàng)建一個基于定制設備的Wi ndows CE所需的一切。
串行端口在Windows CE.NET 4.2(以下簡稱Windows CE)下屬于流接口設備,他是串行設備接口常規(guī)I/O驅動程序的調用與通信相關的具體函數的結合。串行設備被視為用于打開、關閉和讀寫串行端口的常規(guī)的可安裝的流設備。Windows CE的串口函數和Windows的串口函數基本相同,但有幾點值得注意:
(1)Windows CE只支持Unicode字符集,在編程時必須特別注意。
(2) Windows CE不支持重疊的I/O操作。
2.1打開和關閉串行端口
在所有的流設備驅動程序中,均使用CreateFile來打開串行端口設備,如果這個端口不存在,CreateFile返回 ERROR_FILE_NOT_FOUND。因此,用戶指定的端口必須是存在并且可用的,而且要遵循Windows CE流接口設備驅動程序的命名規(guī)則,即COM后接要打開的端口號再緊跟一個冒號。
HANDLE hPort = CreateFile (_T(COM1:),
GENERIC_READ|GENERIC_WRITE, 0,NULL,
OPEN_EXISTING,0,NULL);
關閉串行端口比較簡單,調用CloseHandle函數就能關閉一個打開的串行端口。CloseHandle只有一個參數,即調用CreateFile函數打開端口時返回的句柄,方法如下:
CloseHandle (hPort);
2.2讀寫串行端口
正如使用CreateFile打開串行端口一樣,可以使用ReadFile和WriteFile函數來讀寫串行端 口。假設已經調用CreateFile成功地打開了串行端口,那么只需調用ReadFile即可從串行端口讀取數據:
由于Windows CE不支持重疊的I/O操作,所以第5個參數必須設置為NULL。寫串行端口也很 簡單。調用過程如下:
如果從主線程讀、寫大量的串行數據,主線程就會因為等待相對較慢的串行讀或串行寫操作而阻塞,不能即時處理其他的消息。因此最好用單獨的線程來讀寫串行端口。
2.3配置串行端口
讀和寫串行端口比較簡單,但是還需要對端口配置好正確的波特率、字符長度、奇偶校驗、傳輸模式等,端口才能正確通信??梢哉{用I/O設備控制(IOCTL)來配置串行驅動程序,但此操作需要一些底層的知識,并且要有相應的“嵌入工具包”(ETK),而SDK不能實現該操作。除此之外,還有一種更簡單的方法,就是調用GetCommState和SetCommState函數配置串行端口。由于配置端口的DCB結構內容較多,所以使用起來比較麻煩。錯誤地初始化 DCB結構是配置串行端口常見的問題。如果一個串行通信函數沒有產生預期的效果,那么錯誤很可能是在DCB結構體的賦值。在與單片機實現串行通信的時候,由于只用到了RS 232串行口的RXD,TXD和GND三個引腳,而其他的引腳均舍棄不用,所以DCB的成員變量應該如下設置,否則不能正常通信:
2.4設置超時值
對于串行端口來說,還必須配置超時值,否則程序可能陷入到一個等待來自串口字符的死循環(huán)。通常,配置超時值和配置串口類似。首先用 GetCommTimeouts函數獲取當前串口的超時值,然后修改CommTimeouts成員變量的值,最后用SetCommTimeouts設置新的超時值。
通信相關文章:通信原理
評論