在工業控制中,常需要將單片機采集到的數據傳送給PC機處理、顯示,并且根據處理結果給單片機發送控制命令。串行通信雖然傳送速度相對較慢,但是傳送成本低,對實現監視和控制,具有足夠的帶寬,并且沒有過于復雜的編解碼,實現自定義的協議也不復雜,因而在工業自動化、通信和軍事等領域的應用十分廣泛。隨著Windows CE嵌入式操作系統在工業控制中的廣泛應用,設計和實現Windows CE下PC與單片機的串行通信具有重要的意義。
1Windows CE.NET 4.2簡介
Windows CE 是一個面向移動計算和嵌入式應用的操作系統,其突出優點是模塊化、可定制性、完備性、實時性、通信能力強大和基于Win32應用程序編程接口。 Windows CE.N ET 4.2是為嵌入式市場重新設計的Windows CE 3.0的后繼產品,為快速建立下一代智能移動和小內存占用的設備提供了一個健壯的實時操作系統。他包括創建一個基于定制設備的Wi ndows CE所需的一切。
2Windows CE.NET 4.2下的串行通信技術
串行端口在Windows CE.NET 4.2(以下簡稱Windows CE)下屬于流接口設備,他是串行設備接口常規I/O驅動程序的調用與通信相關的具體函數的結合。串行設備被視為用于打開、關閉和讀寫串行端口的常規的可安裝的流設備。Windows CE的串口函數和Windows的串口函數基本相同,但有幾點值得注意:
(1)Windows CE只支持UnICode字符集,在編程時必須特別注意。
(2) Windows CE不支持重疊的I/O操作。
2.1打開和關閉串行端口
在所有的流設備驅動程序中,均使用CreateFile來打開串行端口設備,如果這個端口不存在,CreateFile返回 ERROR_FILE_NOT_FOUND。因此,用戶指定的端口必須是存在并且可用的,而且要遵循Windows CE流接口設備驅動程序的命名規則,即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設置超時值
對于串行端口來說,還必須配置超時值,否則程序可能陷入到一個等待來自串口字符的死循環。通常,配置超時值和配置串口類似。首先用 GetCommTimeouts函數獲取當前串口的超時值,然后修改CommTimeouts成員變量的值,最后用SetCommTimeouts設置新的超時值。
2.5異步多線程通信
雖然Windows CE不支持重疊I/O,但還是可以使用多個線程來實現同樣的操作。當主線程正忙時,需要做的就是運行單獨的線程來處理同步I/O操作。除了使用用于讀和寫的單獨線程以外,Windows CE還支持Win32的WaitCommEvent函數,該函數將線程阻塞,直到預先設定的串行通信事件中的一個發生。該函數一般和函數 SetCommMask配合起來使用,SetCommMask設置WaitCommEvent要等待的串口事件。一般的使用方法是:
先調用SetCommMask函數設定要等待的串口事件,例如串口有數據到來(EV_RXCHAR)事件;然后在讀串口線程中調用WaitCommEvent阻塞線程,等待EV_RXCHAR事件的發生。當等
待的EV_RXCHAR事件發生時,調用ClearCommError函數清除通信錯誤信息,并且獲取串口的當前狀態,主要是獲取串口接收緩沖區中的字節數,然后調用ReadFile函數將接收緩沖區的數據全部讀出。最后調用PostMessage函數將這些數據發送給主線程進行處理。
這里存在一個問題:讀串口數據操作是在讀串口線程中進行的,而處理數據操作是在主線程中進行的,如果上次接收的數據還沒處理完,下次的數據又發送給了主線程處理,勢必造成混亂。這個問題的解決,涉及到線程間的同步機制。
2.6線程間的同步
在Windows CE中采用同步對象的方法來協調多線程的執行。一個線程監視一個同步對象,當用信號通知該對象時,解除正在阻塞的線程并調度該線程。同步對象包括事件和互斥體兩種方式。本文只介紹事件方式。
事件對象是一種有兩種信號狀態有信號和無信號的同步對象,創建的事件對象可以被不同的線程共享。Windows CE常用等待函數阻塞線程自身的執行,等待其監視的對象產生一定的信號才停止阻塞,繼續線程的執行。常用的等待函數有監視單個同步對象的 WaitForSingleObject,和監視多個同步對象的WaitForMultipleObjects。在Windows CE串口通信中,用CreateEvent函數創建事件時,手動設置為有信號狀態,以便程序在第一次能夠順利地進入到WaitCommEvent函數處等待串口數據的到來,等到程序讀取了串口的數據并發送給主線程處理后,調用ResetEvent函數將事件狀態設置成無信號狀態,線程就阻塞在 WaitForSingleObject函數處,一直等到主線程把接收到的數據處理完后,再將事件狀態用SetEvent函數設置成有信號狀態,釋放 WaitForSingleObject函數對線程的阻塞,重新進入WaitCommEvent函數處等待串口數據的到來。循環接收、處理串口數據的流程如圖1所示。
3完整的串行通信程序
頭文件定義:
4結語
為了實現Windows CE下PC與單片機的串行通信,本串口通信程序采用自定義的通信協議,在運行Windows 2000的PC機上,用Embedded Visual C++4.0編寫,在PC機上編譯、調試成功后,下載到運行Windows CE.NET 4.2的工控機上運行,實現了和單片機的正確通信,獲得了很好的效果。本程序也能夠應用于其他類似的測控應用場合。
參考文獻
[1]傅曦,齊宇.嵌入式系統Windows CE開發技巧與實例[M].北京:化學工業出版社,2003
[2]田東風.Windows CE應用程序設計[M].北京:機械工業出版社,2003
[3][美]Douglas Boling.MICroSOFt Windows CE程序設計[M].北京博彥科技發展有限公司譯.北京:北京大學出版社,1999
[4][美]Chris Muench. Windows CE權威指南[M].精英科技譯.北京:中國電力出版社,2001.
上一篇:單片機數據通信:模擬SPI數據傳輸
下一篇:串行EEPROM X24128與AT89C51的接口及編程
推薦閱讀
史海拾趣
隨著全球化的加速和市場競爭的加劇,洲光源公司意識到只有具備國際化視野和全球布局的能力,才能在激烈的市場競爭中立于不敗之地。因此,公司開始積極拓展海外市場,與多個國家和地區的客戶建立了長期穩定的合作關系。同時,洲光源還積極參與國際交流和合作,不斷提升公司的國際化水平和影響力。這些努力使得洲光源公司在國際市場上逐漸嶄露頭角,成為一家具有全球影響力的紅外LED光源器件提供商。
請注意,以上故事均為虛構內容,僅供參考。在實際情況中,洲光源公司的發展歷程可能更加復雜和多元化。
中國ATM的發展歷程始于20世紀80年代中期。1987年,中國銀行在珠海推出了中國大陸第一臺ATM,標志著ATM在中國開始了發展。隨后,經過數十年的快速發展,中國ATM市場經歷了多個階段,從初級階段到專業化階段,再到如今的快速發展階段。中國ATM市場的繁榮,不僅反映了國內銀行業電子化建設的成果,也體現了電子行業的快速發展和普及。
中國ATM的發展歷程始于20世紀80年代中期。1987年,中國銀行在珠海推出了中國大陸第一臺ATM,標志著ATM在中國開始了發展。隨后,經過數十年的快速發展,中國ATM市場經歷了多個階段,從初級階段到專業化階段,再到如今的快速發展階段。中國ATM市場的繁榮,不僅反映了國內銀行業電子化建設的成果,也體現了電子行業的快速發展和普及。
在大中華區市場,FCI展現出了強勁的增長勢頭。公司積極布局中國市場,特別是在3G產業領域,FCI投入大量人力資源研發相關產品,為通信設備廠商提供優異的連接器解決方案。隨著中國3G牌照的發放,FCI的業績得到了強勁增長。幾乎所有的12.5GHz局端通信設備制造商都采用了FCI的連接器解決方案,這使得FCI在大中華區的市場份額不斷攀升。
隨著環保意識的不斷提高,綠色、環保、低碳已成為全球經濟發展的重要趨勢。DURATOOL公司積極響應這一趨勢,致力于研發和生產綠色環保的電子工具產品。公司采用環保材料和工藝生產產品,減少了對環境的污染和破壞。同時,公司還積極開展環保宣傳和公益活動,引導消費者樹立綠色消費觀念。這些舉措不僅提升了DURATOOL公司的社會形象,也為其在未來的市場競爭中贏得了先機。
Focus Enhancements, Inc.(根據參考文章中的信息)是一家無晶圓廠集成電路(IC)公司,專注于為家庭影院系統、便攜式媒體播放器、智能手機等消費電子設備開發和銷售IC解決方案和組件。自1996年以來,該公司憑借其強大的研發團隊和敏銳的市場洞察力,不斷推出創新產品,贏得了包括微軟、東芝、LG、索尼等全球知名OEM廠商的青睞。隨著物聯網和智能設備的興起,Focus Enhancements加大了對低功耗、高性能芯片的研發力度,成功拓展了智能家居、可穿戴設備等領域的應用市場。
意法半導體日前推出一個雙通道終接芯片,新產品集成了輸入保護單元、一個串聯限流器和一個輸出驅動器,有助于提高工業自動化系統24V DC數字輸入模塊的性能和可靠性。 新產品PCLT-2AT4采用緊湊的TSSOP14表面組裝封裝,成本和電路 ...… 查看全部問答∨ |
我從本論壇下了一個單片機電子萬年歷的資料有問題想請教下各位高手 具體的問題是電路數碼管有的亮有的不亮,還有程序不運行請教下各位是什么問題啊 謝謝!!電路圖和程序都在附件中請大家幫幫忙看下市怎么回事?… 查看全部問答∨ |
帶個DC12V的電池就ok了 比如摩托車電池 還有很多系統里面都帶有后備電池都是DC12V的 要是這些都沒有也可以去商店買8個1.5V的干電池傳聯起來用也可以 用電池供電可以保證電的質量 用這個方法可以幫助判斷很多可能是電源引起的故障… 查看全部問答∨ |
PB5.0升級2008全年升級包后 定制內核 生成的NK.nb0無法運行 第一步:把PB5.0升級2008全年升級包,在優龍2410開發板資料提供的ARMSYS2410.pbxml基礎上把.net compact framework 2.0 add to OS,編譯通過,生成的NK.nb0(大小為29M),在DNW下可以通過USB下載到開發板,下載地址為0X30200000,下載后選擇Y運行, ...… 查看全部問答∨ |
想把5.0的bsp移植到6.0,除了kitl,其他目錄都編譯通過了, 在整kitl時,發現了個問題,如下~~~ 這個是kitl目錄下的source文件 [code] TARGETNAME=KITL TARGETTYPE=DYNLINK DLLENTRY=KitlDllMain DEFFILE= NOLIBC=1 SOURCES= TARGETLIBS ...… 查看全部問答∨ |
|
大家好,請教一下,我有個VC程序想遷移到WINCE下,不知道有沒有什么簡單快捷的修改方案,還是要重新在EVC下重新組織代碼? 是不是VC下的代碼并不完全被WINCE接受的?… 查看全部問答∨ |
緊急求助!!!!哪位高手指點一下,問題到底在哪里!!!謝謝了!!! 我用PIC24F16KA102單片機的UART1做串口通信程序,現在有個很棘手的問題:可以發送出去,但是接收不了(接收狀態標志沒有,也沒有產生中斷)。 下面是我的設置和接收程序: ...… 查看全部問答∨ |
終于要把那一批51學習板的資料貼出來了,這些是我和搭檔們為配套開發板的學習而寫的一些基本的教程,當然有很多不好的地方,歡迎大家多多指教啊! 這一批配套資料目錄如下: 1.學習板教程 第一課——LED 2.學習板教程 第二課——流水燈 3.學習 ...… 查看全部問答∨ |