WindowsCE嵌入式高級(jí)編程其實(shí)例詳解10_第1頁(yè)
WindowsCE嵌入式高級(jí)編程其實(shí)例詳解10_第2頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1/ 59第 10 章串口編程串口是計(jì)算機(jī)與外部串行設(shè)備之間的數(shù)據(jù)傳輸通道,因?yàn)榇型ㄐ欧奖阋仔?,因此?yīng)用非常廣泛。例如在工業(yè)自動(dòng)化中,很多智能采集設(shè)備都是采用串口方式和PC 機(jī)進(jìn)行通訊。在Windows CE 嵌入式電腦中,串口依然是和外部設(shè)備進(jìn)行通訊的重要方式,例如GPS 設(shè)備。目前很多 PDA 都集成了藍(lán)牙通訊功能,可以通過(guò)設(shè)置藍(lán)牙通訊方式為串口方式,來(lái)和另外一 端藍(lán)牙設(shè)備進(jìn)行通訊。作為一名Win dows CE 程序編寫人員,掌握串口編程知識(shí),將會(huì)為日后工作提供極大的便利。本章主要包括如下內(nèi)容:串口概述串口編程 API 函數(shù)介紹串口綜合示例 GPS 編程示例10. 1 串口概述“串行通

2、信”是指外設(shè)和計(jì)算機(jī)間使用兩根數(shù)據(jù)信號(hào)線(另外需要地線,可能還需要控制線,數(shù)據(jù)在一根數(shù)據(jù)信號(hào)線上一位一位地進(jìn)行傳輸,每一位數(shù)據(jù)都占據(jù)一個(gè)固定的時(shí)間長(zhǎng) 度。這種通信方式使用的數(shù)據(jù)線較少,在遠(yuǎn)距離通信中可以節(jié)約通信成本,而且其傳輸速度也不比并行傳輸?shù)乃俣嚷?。相反的,“并行通信”是指一條信息的各位數(shù)據(jù)被同時(shí)傳送。并行通訊的特點(diǎn)是:各數(shù)據(jù)位同時(shí)傳送、傳送速度快、效率高,但因?yàn)橛卸嗌贁?shù)據(jù)位就需多少根數(shù)據(jù) 線,因此傳送成本較高,比較適用于近距離(相距數(shù) M 的通訊。目前較為常用的串口有9 針串口(DB9和 25 針串口(DB25,當(dāng)通信距離較近時(shí)(,可以使用電纜線直接連接標(biāo)準(zhǔn)RS232 端口 (RS422

3、 和 RS485 較遠(yuǎn),若通信距離較遠(yuǎn),則需附加調(diào)制解調(diào)器(Modem表 1 0 .1 將 簡(jiǎn) 要 說(shuō) 明 D B 9 常 用 信 號(hào) 腳 定 義 。表 1 0 .1 D B 9 常 用 信 號(hào) 腳 說(shuō) 明 表9 針串口 (DB925 針串口(DB25Q 匸口 針號(hào)功能說(shuō)明縮寫針號(hào)功能說(shuō)明縮寫數(shù)據(jù)載波檢測(cè)DCD8數(shù)據(jù)載波檢測(cè)DCD2接收數(shù)據(jù)RXD3接收數(shù)據(jù)RXD3發(fā)送數(shù)據(jù)TXD2發(fā)送數(shù)據(jù)T(D4數(shù)據(jù)終端準(zhǔn)備DTR20數(shù)據(jù)終端準(zhǔn)備DTR5信號(hào)地GND7信號(hào)地GND續(xù)表2/ 599 針串口(DB925 針串口(DB25針號(hào)功能說(shuō)明縮針功能說(shuō)明6數(shù)據(jù)設(shè)備準(zhǔn)備好DSR6數(shù)據(jù)準(zhǔn)備好DSR7請(qǐng)求發(fā)送RTS

4、4請(qǐng)求發(fā)送RTS8清除發(fā)送CTS5清除發(fā)送CTS9振鈴指示DELL22振鈴指示DELL最簡(jiǎn)單且常用的接線方式是三線制接法,即地、接收數(shù)據(jù)和發(fā)送數(shù)據(jù)三腳相連,即只要有接收數(shù)據(jù)針腳和發(fā)送針腳就能實(shí)現(xiàn)串口數(shù)據(jù)傳輸;對(duì)于同一個(gè)串口,只要接收腳和發(fā)送腳直接用線相連,那么在此串口發(fā)送什么數(shù)據(jù),該串口就可以接收什么數(shù)據(jù)。對(duì)于兩個(gè)不同串口(不論是同一臺(tái)計(jì)算機(jī)的兩個(gè)串EI 或分別是不同計(jì)算機(jī)的串13,均可以采用如表 10 . 2 所示的接線方式。表 10. 2 不同串口接線方式表9 針一 9 針25 針-25 針9 針-25 針233222322333557757對(duì)于口硬件介1.打在訪肛 開(kāi)串口,有 函數(shù)打開(kāi)目

5、 碼中,將赫HANDL第 10 章串口編程353在此需要說(shuō)明的是,在 CreateFile 函數(shù)的參數(shù)中,共享參數(shù)必須設(shè)置為0,表示獨(dú)占方式;安全參數(shù)必須設(shè)置為 NULL 值;模板文件參數(shù)也必須被設(shè)置成NULL因?yàn)樵?Win dows CE 中,不支持重疊 I / O 模式,因此不能在參數(shù) dwFlagsA ndAttributes中傳遞 FILE FLAG OVERLAPPED 如果打開(kāi)串口成功,將返回打開(kāi)串口的句柄,否則將返回INVALID HANDLE VALUE打開(kāi)串口之后,串口就已經(jīng)被獨(dú)占了,因此當(dāng)不再使用已打開(kāi)的串口時(shí),應(yīng)及時(shí)關(guān)閉 串口,此時(shí)可以使用CloseHa ndle 函數(shù)關(guān)

6、閉串口。例如可以使用以下代碼來(lái)關(guān)閉上面打開(kāi)的串口:BOOL bResult=CloseHandle(hComm ;2配置串口 在使用串口和另外一個(gè)設(shè)備進(jìn)行通訊時(shí),一定要先設(shè)置串口的參數(shù) ( 波特率、奇偶校 驗(yàn)、數(shù)據(jù)位等 ,這些參數(shù)設(shè)置正確與否將直接影響是否能夠和串口設(shè)備進(jìn)行通訊。串口參數(shù)信 息一般由串口設(shè)備廠家提供。 Windows CE 中提供了 GetCommState 和 SetCommState 函數(shù),分 別用于獲取串口的當(dāng)前參數(shù)和設(shè)置串口的參數(shù),它們的定義如下:3/ 59B00L GetCommState(HANDLE hFile ,LPDCB IpDCB;BOOlJ SetComm

7、State fHANDLE hFile ,LPDCB IpDCBj這兩個(gè)函數(shù)都包含了相同的參數(shù),其中參數(shù) hFile 是輸入?yún)?shù),指向已打開(kāi)的串口句 柄;參數(shù) IpDCB 指向 DCB 結(jié)構(gòu)的指針,在 GetCommState 函數(shù)中,它屬于輸出參數(shù),在 SetCommState函數(shù)中,它屬于輸入?yún)?shù)。DCB 吉構(gòu)完全描述了串口的使用參數(shù),它的定義如下:typedef sDWORD DCIDWORD BaDWORD fBtruct DCBB1enqthudRate ;inary : 1/ DCB 吉構(gòu)大小波特率/ _- 進(jìn)制模式DWORD fParity : 1; /進(jìn)行奇偶校驗(yàn)DWORD f

8、OutxCtsFlow: 1; /使 CTS 信號(hào)進(jìn)行輸出流量控制DWORD fOutxDsrFlow: 1 j /使 DSR 信號(hào)進(jìn)行輸出流量控制DWORD fDtrControl : 2;/ DTR 流量控制DWORD fDsrsensitivitv : 1;/ DSR 敏感度DWORD fTXContinueOnXoff: b/ XOFF 后是否繼續(xù)發(fā)送DWORD fOutX 1;/使得輸出 XON/ XOFF 有效DWORD flnX l ; /使得輸入 XON/XOFF 有效DWORD fErrorChar :1 j/允許奇偶錯(cuò)誤替換DWORD fNull:l ;/允許刪除 NULL

9、DWORD fRtsControl : 2 j/ RTS 流量控制DWORD fAbort On Error : 1 j /出錯(cuò)時(shí)是否終止讀寫操作DWORD fDummy217;/保留WORD wReserved /當(dāng)前未用,必須置為 0WORD Xo nLim / XON 閾值WORD XoffLim;/ XOFF 閾值4/ 59char EvtChar ; j f萼懈導(dǎo)符WORD wReservedl;/保留,未用DCB成員 DCBlength 指定了 DCB 吉構(gòu)大小。成員 BaudRate 指定了串口設(shè)備的傳輸速率。波特率的范圍一般是從每秒110 位到每秒 256000 位。成員 fB

10、inary 必須被設(shè)置 TRUE 因?yàn)樵?CE 中不支持非二進(jìn)制的串行傳輸模式。成員 fParity 表示啟用奇偶校驗(yàn),該值一般被設(shè)置TRUE 以便啟用奇偶校驗(yàn)。成員 fOutxCtsFlow 用于指定 CTS(Clear T0. SendB號(hào)是否被監(jiān)視并作為輸出流量控制信號(hào)。如果此成員被設(shè)置為TRUE 并且 CTS 信號(hào)被關(guān)閉,則輸出被掛起,直到 CTS 信號(hào)重新發(fā)出。成員 fOutxDsrFlow 用于指定 DSR(Data Set Ready號(hào)是否監(jiān)視并作為輸出流量控制信號(hào)。若此成員被設(shè)置TRUE 并且 DSR 信號(hào)被關(guān)閉,則輸出被掛起,直到DSR 信號(hào)重新發(fā)出。成員 fDtrContr

11、ol 指定 DTR(DataTerminal . Ready號(hào)作為流量控制,此成員可以 是表 l0 . 3 中列出的值。表 10. 3 fDtrControl成員取值表值描述DTRCONTROL DISABLE當(dāng)串口設(shè)備打開(kāi)時(shí),DTR!號(hào)線始終設(shè)為禁止DTRCONTROL ENABLE當(dāng)串口打開(kāi)時(shí),DTF 信號(hào)線設(shè)為使能并始終打開(kāi)DTRCONTROL HANDSHAKE使 DTR持握手,此時(shí)可調(diào)用 EscapecommFunction 函 數(shù)來(lái)釋放 DTF 線上的錯(cuò)誤第 10 章串口編程355輸入緩沖區(qū)中存有數(shù)據(jù)的空間達(dá)到XoffLim 定義的字節(jié)數(shù)時(shí),XoffChar 將被發(fā)送;當(dāng)輸入緩沖區(qū)

12、中可用的空間達(dá)到Xo nLim 定義的字節(jié)數(shù)時(shí),Xon Char 被發(fā)送。成員 fErrorChar 指定當(dāng)收到的字符發(fā)生奇偶校驗(yàn)錯(cuò)誤時(shí),是否使用ErrorChar 成員定義的字符代替。若此成員設(shè)為TRUE 且 fP 撕夠成員為 TRUE 將會(huì)發(fā)生替換。成員 fNull 指定 null 是否被丟棄。若此成員設(shè)為TRUE 則接收到的 NULL 字符被放棄。成員 fRtsControl 指定 RTS(request-to-send 流量控制。若此值為 0,則缺省值為 RTS CONTROLHANDSHAK 表 l0 4 歹 0 出了該成員的可用值。表 10-4 fRtsCo ntrol成員的可用值

13、表值描述RTSCONTROL DISABLE當(dāng)串口設(shè)備打開(kāi)時(shí),RTS 線始終為禁止RTS-. CONTROL ENABLE當(dāng)設(shè)備打開(kāi)時(shí),RTS 線始終設(shè)為使能并始終打開(kāi)RTSCONTROL HANDSHAKE啟用 RTS1 手功能。當(dāng)輸入緩沖區(qū)字符小于緩沖區(qū)總數(shù)的1 /2 時(shí),驅(qū)動(dòng)程序使 RTS 言號(hào)為高,超過(guò) 3/ 4 時(shí),使 RTS 言號(hào)為低。若 RTS1 手 功能可用,可調(diào)用 EscapeCommFunction 函數(shù)釋放 DTR上的錯(cuò)誤RTSCONTROL TOGGLE指定當(dāng)發(fā)送數(shù)據(jù)時(shí),RTS 言號(hào)線為高,緩沖區(qū)數(shù)據(jù)發(fā)送完,RTS 言號(hào)線為低成員 fAbort On Error 指定當(dāng)

14、錯(cuò)誤發(fā)生時(shí),讀寫操作是否終止。若此成員設(shè)置為TRUE則當(dāng)錯(cuò)誤發(fā)生時(shí),所有的讀寫操作將終止,直到應(yīng)用程序識(shí)別錯(cuò)誤并調(diào)用5/ 59ClearCommError 函數(shù)后,驅(qū)動(dòng)程序才進(jìn)行更深層次的通訊。成員 fDummy2 保留,未用。成員 wReserved 未用,必須置為 0。成員 XonLim 指定發(fā)送 XON 字符前輸入緩沖區(qū)允許的最小字節(jié)數(shù)。成員 XoffLim 指定發(fā)送 XOFF 字符前輸入緩沖區(qū)允許的最大字節(jié)數(shù)。最大允許接收 字符數(shù)可以用定義的全部輸入緩沖區(qū)字節(jié)數(shù)減去此值得到。成員 ByteSize 指定每字節(jié)發(fā)送接收的位數(shù)。成員 Parity 指定奇偶校驗(yàn)方法。表 10 5 列出了該成

15、員的可用值。表 10-5 Parity成員的可用值表值描述EVENRUUTY偶校驗(yàn)MARKpARTTY標(biāo)記校驗(yàn)NORUUTY無(wú)校驗(yàn)ODDBUUTY奇校驗(yàn)SPACEPfUUTYSpace成員 StopBits 用于指定停止位的位數(shù)。該成員的可用值如表 10-6 所示。 成員 XonChar 指定發(fā)送接收的 XON 字符。成員 XoffChar 指定發(fā)送接收的 XOFF 字符。成員 ErrorChar 指定當(dāng)接收的奇偶校驗(yàn)錯(cuò)誤時(shí)被代替的接收字符。356 Windows CE 嵌入式高級(jí)編程及其實(shí)例詳解(用 C+實(shí)現(xiàn)表 10-6 StopBits成員可用值表值描述ONESTOPBIT1 位停止位1

16、山 E5STOPBITS1.5 位停止位TWOSTOPBITS2 位停止位成員 EofChar 指定某字符作為數(shù)據(jù)結(jié)束標(biāo)記。成員 EvtChar 指定某字符作為事件標(biāo)記。 成員 wReserved 被保留,未用。在設(shè)置串口參數(shù)時(shí),最好先用GetCommState 函數(shù)得到串口的當(dāng)前參數(shù),然后再修改需設(shè)置的成員。3.讀、寫串口正如使用 CreateFile函數(shù)打開(kāi)串口一樣,開(kāi)發(fā)人員同樣可以使用ReadFile 和WriteFile 函數(shù)讀取串口數(shù)據(jù)和向串口中寫入數(shù)據(jù)。關(guān)于ReadFile 和 writeFile函數(shù)的介紹,請(qǐng)參考第6 章文件編程中的介紹。這里需要注意的是,因?yàn)閺拇谥凶x寫數(shù)據(jù)的速

17、度比較慢,因此不要試圖在主線程中 讀寫大量數(shù)據(jù),這樣會(huì)阻塞主線程中處理主窗體的消息隊(duì)列,最好的方法就是用單獨(dú)的線程 來(lái)讀寫數(shù)據(jù)。在下面的串口綜合使用示例中將會(huì)介紹ReadFile 和 WriteFile函數(shù)的具體用法。4.異步串口 I /O雖然 Windows CE 中不支持重疊 I /O 操作,但還是可以分別用單獨(dú)的線程去讀寫串 口,通過(guò)多線程來(lái)模擬重疊操作。同時(shí)Windows CE 還提供了 WaitCommEvent 函數(shù),該函數(shù)將阻塞線程,直到預(yù)先設(shè)置的串口事件中的某一事件發(fā)生。在后面的串口綜合使用示例中將會(huì)介 紹6/ 59WaitCommEve nt 函數(shù)的使用。在使用串口事件前,還

18、需要了解如下三個(gè)函數(shù):BOOL GetCommMask(HANDLE hFile , LPDWORD ipEvtMaskBOOL SetCommMask(HANDLE hFile , DWORD dwEvtMask;BOOLWaitCommEvent(HANDLEhFile , LPDWORD IpEvtMask , LPOVERLAPPEDIpOVerlapped; GetCommMask 函數(shù)用于得到串口已經(jīng)設(shè)置了的串口事件,參數(shù)hFile 指定已打開(kāi)的串口句柄,參數(shù) IpEvtMask 用于存取得到串口事件集。 SetCommMask 函數(shù)的功能與 GetCommMas 函數(shù)相反,用于設(shè)

19、置串口事件集。 WaitCommEvent 函數(shù)用于等待預(yù)先設(shè)置的串口事件中的某一事件發(fā)生。參數(shù)IpEvtMask用于存儲(chǔ)已經(jīng)的發(fā)生事件;參數(shù) IpOverlapped 必須被設(shè)置 NULL 因?yàn)樵赪in dows CE 中不支持重疊結(jié)構(gòu)。上面三個(gè)函數(shù)中的第 2 個(gè)參數(shù),即串口事件集,它可以是表I0 7 中的某個(gè)值或其中組合。表 10. 7 串口事件表描述EVBREAK檢測(cè)到中斷發(fā)生EV CTSCTS 改變了狀態(tài)EV DSRDSRB號(hào)改變了狀態(tài)第 10 章串口編程357續(xù)表描述EV ERR串口驅(qū)動(dòng)程序檢測(cè)到了錯(cuò)誤EV RING檢測(cè)到振鈴EV RLSDRLSD 行改變了狀態(tài)EVRXCHAR接收到

20、了一個(gè)字符EVRXFLAG接收到了一個(gè)事件字符EVTXEMPTY 。在輸岀緩沖區(qū)中的最后個(gè)字符被發(fā)生5 .設(shè)置端口讀寫超時(shí)在調(diào)用 ReadFiIe 和 WriteFiIe函數(shù)從串口讀取數(shù)據(jù)和寫入數(shù)據(jù)時(shí),Windows CE 提供了超時(shí)機(jī)制,也即是設(shè)置了等待它們返回的時(shí)間長(zhǎng)度。設(shè)置串口超時(shí)函數(shù)SetCommTimeouts 的定義如下所示:BOOL SetCommTimeoutS(HANDLE hFiIe ,LPCOMMTIMEOUTS lpCommTimeoutsj 參數(shù) IIFile 指向已經(jīng)打開(kāi)的串口句柄。 參數(shù) IpCommTimeouts 指向 COMMTIMEOu 結(jié)構(gòu),設(shè)置新韻超時(shí)

21、值。COMMTIMEOUTS 吉構(gòu)定義如下:7/ 59typedef struct COMMTIMEOUTSDWORD ReadIntervaITimeout ;DWORD ReadTotaITimeoutMuItipIier ;DWORD ReadTotaITimeoutConstant ;DWORD WriteTotaITimeoutMuItipIier ;DWORD WriteTotaITimeoutConstant ;COMMTIMEOUTS, +LPCOMMTIMEOU;TS讀超時(shí)的計(jì)算方法有兩種,一種超時(shí)是 ReadIntervaITimeout 指定了在接收字符間的 最大 時(shí)間間

22、隔,如果超過(guò)了這個(gè)時(shí)間, ReadFiIe 函數(shù)立刻返回;另一種超時(shí)是基于要接收的字 符數(shù)量 , ReadTotaITimeoutMuItipIier表 示 平 均 讀 一 字 節(jié) 的 時(shí) 間 上 限 ,ReadTotaITimeoutConstant 表示讀數(shù)據(jù)總超時(shí)常量。第二種讀數(shù)據(jù)超時(shí)可用如下等式表示:讀數(shù)據(jù)總超時(shí) =ReadTotaITimeoutConstant+(ReadTotaITimeoutMuItipIier*要讀的字節(jié)數(shù)寫超時(shí)計(jì)算方法與讀超時(shí)的第 2 種計(jì)算方法相似, WriteTotaITimeoutMuItipIier 表示 平均寫一字節(jié)的時(shí)間上限, WriteTota

23、ITimeoutConstant 表示寫數(shù)據(jù)總超時(shí)常量,總超時(shí)計(jì)算方 法如下:寫數(shù)據(jù)總超時(shí) =WriteTotaITimeoutConstant+(WriteTotaITimeoutMuItipIier*要寫的字節(jié)數(shù) 對(duì)于讀數(shù)據(jù)超時(shí),第一種超時(shí) (間隔超時(shí) 和第二種超時(shí) ( 總超時(shí) 同時(shí)有效,當(dāng)出現(xiàn) 任何一種超時(shí)時(shí),都將返回。下面是詳細(xì)的超時(shí)值設(shè)置: 有讀間隔超時(shí)、讀總超時(shí)和寫總超時(shí):將COMMTIMEOU 結(jié)勾中的五個(gè)成員設(shè)置為相應(yīng)值。 有讀總超時(shí)和寫總超時(shí),但沒(méi)有讀間隔超時(shí):將ReadIntervaITimeout 設(shè)置為0,將其黔叩一8/ 59358 windows cE 嵌入式高級(jí)編程

24、及其實(shí)例詳解 ( 用 c+ 實(shí)現(xiàn) 他字段設(shè)置為相應(yīng)值。 不管是否有數(shù)據(jù)要讀取,ReadFile 立刻返回:將 ReadlntervalTimeout 設(shè)置成MAX DWORD,將 ReadTotalTimeoutMultiplier 和 ReadTotalTimeoutConstant 都設(shè)置 成 0 。ReadFile 沒(méi)有超時(shí)設(shè)置,直到有適當(dāng)?shù)淖址麛?shù)返回或錯(cuò)誤發(fā)生,該函數(shù)才返回:將ReadInte IV alTimeout、 ReadTotalTimeoutMultiplier禾口 ReadTotalTimeoutConstant值都設(shè)置為 0。writeFile 沒(méi) 有 超 時(shí) 設(shè) 置

25、: 將 WriteTotalTimeoutMultiplier和WriteTotalTimeout_Constant都設(shè)置成 0。對(duì)于串口讀寫,以上所介紹到的超時(shí)操作是至關(guān)重要的。讀者可以根據(jù)實(shí)際情況考慮 采 用何種超時(shí)操作。如果從串口讀取數(shù)據(jù)和寫入數(shù)據(jù)都采用超時(shí),最好采用單獨(dú)的線程負(fù)責(zé) 讀取和寫入,以使不會(huì)阻塞主線程。Windows CE 還提供了 SetupComnl 函數(shù)來(lái)設(shè)置接收和發(fā)送數(shù)據(jù)的緩沖區(qū)的大小。它的 定 義如下: 。BOOL SetupComm(HANDLE hFile ,DWORD dwInQueue ,DWORD dwOutQueue; 參數(shù) hFile 指定已經(jīng)打開(kāi)的串

26、口句柄。 參數(shù) dwlnQueue 和 dwOutQueue 指定接收和發(fā)送緩沖區(qū)的大小。SetupConlm 并不推薦使用,因?yàn)橄到y(tǒng)會(huì)推薦一個(gè)適合的默認(rèn)值。6控制串口Windows CE 提供了 SetCommBreak 函數(shù),用于停止傳輸字符并將串口置于中斷狀態(tài), 還提供了 ClearCO 刪:llBreak 用于重新傳輸字符。SetCommBreak 和 ClearCommBreak 函數(shù)的定義如下:BOOL SetCommBreak(HANDLE hFile ;BOOL ClearCommBreak(HANDLE hFile ;以上兩個(gè)函數(shù)都只有唯一的入口參數(shù)hFile,表示已打開(kāi)的串

27、口句柄。7.清空串口緩沖區(qū)9/ 59Windows cE 提供了 PurgeComm 函數(shù)用于清空串口的發(fā)送緩沖區(qū)和接收緩沖區(qū),PurgeComm 函數(shù)的定義如下:BOOL PurgeComm(HANDLE hFile ,DWORD dwFlagsj 參數(shù) hFile 表示打開(kāi)的串口句柄。 參數(shù) dwFlags 表示操作類型,在 Windows CE 下該參數(shù)有如下兩種取值。PURGE TXCLEAR :清空發(fā)送緩沖區(qū)。PURGE RXCLEAR:清空接收緩沖區(qū)。第 10 章串口編程359這兩個(gè)值可以組合使用,表示同時(shí)執(zhí)行清空發(fā)送緩沖區(qū)和接收緩沖區(qū)的功能。8.清除錯(cuò)誤并查詢狀態(tài)Windows

28、CE 還提供了一個(gè)非常有用的函數(shù)ClearCommError,用于清除驅(qū)動(dòng)程序產(chǎn)生的任何錯(cuò)誤狀態(tài)并返回當(dāng)前窗口狀態(tài),該函數(shù)定義如下:BOOL ClearCommError(HANDLE hFile ,LPDWORD ipErrors ,LPCOMSTAT ipStat ; 參數(shù) hFile 指向已經(jīng)打開(kāi)的串口句柄。 參數(shù) lpErrors 表示發(fā)生的錯(cuò)誤碼,它的值將是表10. 8 中的任意一個(gè)值或組合。表 10 8 IpErrors參數(shù)取值表錯(cuò)誤碼描述CE- BREAK硬件檢測(cè)到了一個(gè)中斷條件CE- FRAME硬件檢測(cè)到一個(gè)幀錯(cuò)誤CE I0E硬件通訊時(shí)發(fā)生一個(gè) 1 / O 錯(cuò)誤CEMODE請(qǐng)求

29、模式未被支持,或者h(yuǎn)File 參數(shù)無(wú)效。如果這個(gè)值被指定,它就是僅有的合法錯(cuò)誤CE- OVERRUN一個(gè)字符緩沖區(qū)侵占發(fā)生,下一個(gè)字符被丟失CERXOVER輸入緩沖區(qū)溢岀發(fā)生,或者輸入緩沖區(qū)無(wú)空間,或者在收到EndOf File(EOF字符之后又收到字符CERXPARITY硬件檢測(cè)到奇偶校驗(yàn)錯(cuò)誤CE- TXFULL應(yīng)用程序試圖發(fā)送一個(gè)字符,但是輸岀緩沖區(qū)已滿參數(shù) lpStat 指向 COMSTA 結(jié)構(gòu),用于存儲(chǔ)當(dāng)前窗口的狀態(tài)。COMSTA 結(jié)構(gòu)的定義如下所示:tvPedef Struct COMSTATDWORD fCtSH01d 1;DWORD fDsrHOId 1;DWORD fRISdH

30、OId 1;DWORD fXOffH01d 1;DWORD fXoffSe nt :1 ;10/ 59DWORD fEof 1;DWORD fTxim 1jDWORD fReserved : 25;DWORD cbl nQueDWORD cbOutQueCOMSTAT +LPCOMSTATj前 5 個(gè)字段表示串口傳輸是否因?yàn)樗脑蚨却W侄?fCtsHold 表示是否等待 CTS 信號(hào)。字段 ffsrHold 表示是否等待 DSR 信號(hào)。字段 fRlsdHold 表示是否等待“接收線路信號(hào)檢測(cè),也叫載波檢測(cè)”。字段 tXoffHold 表示是否等待 XOFF 字符。字段 fXoffSent

31、 表示是否因?yàn)轵?qū)動(dòng)程序發(fā)送XOFF 字符而等待。字段 fEof 表示是否收到串口尾部字符。字段 fTxim 如果是 1,表示隊(duì)列中的字符是由TransmitCommChar 函數(shù)寫入的而不WriteFile 函數(shù)。字段 cblnQue 表示接收緩沖區(qū)存儲(chǔ)的待讀取的字符數(shù)。字段 cbOutQue 表示發(fā)送緩沖區(qū)中存儲(chǔ)的待發(fā)送的字符數(shù)。在下面的串口綜合示例中, 將利用 ClearCommError函數(shù)來(lái)得到串口接收緩沖區(qū)待 讀取的 字符數(shù)。10. 3 CE 串口綜合示例前一節(jié)中介紹了串口編程的基本知識(shí),本節(jié)將封裝一個(gè)Windows CE 串口使用類CCESeries?;诖祟?,可以方便地開(kāi)發(fā)基于串

32、口方面的通訊應(yīng)用。下面就逐步介紹Win dows CE串口綜合示例的創(chuàng)建過(guò)程。(1 建立新項(xiàng)目。使用 vS20051vC+1 智能設(shè)備 IMFC 智能設(shè)備應(yīng)用程序向?qū)?chuàng)建一個(gè)基于對(duì)話框的應(yīng)用程序 SerialSample,編譯環(huán)境設(shè)置為Windows Mobile 6 Professional SDK(ARMV4I ,設(shè)備選擇 CHSWin dows Mobile 6 Classic Emulator,把窗口字體改成宋體小五號(hào)。(2 新建 CCESeries 類,用于封裝串 1: 3 通訊。CCESeries 類是一個(gè)通用 C+類,無(wú)基類。其類圖如圖10 1 所示。11/ 59圖 10-1 串

33、口類類圖CCESeties類將提供 4 個(gè)公有方法和一個(gè)回調(diào)函數(shù)接口。這4 個(gè)公有方法分別為0penPort、closePort、writesyncPort 和 SetSeriesTimeOuts。其中 OpenPort 方法用于根據(jù)其指定的參數(shù)打開(kāi)串口,并創(chuàng)建讀線程來(lái)異步接收數(shù)據(jù);ClosePort 方法與 OpenPort 方法相對(duì)應(yīng),用于關(guān)閉串口釋放相關(guān)資源,同時(shí)也將關(guān)閉讀線程;SetSeriesTimeOuts方法用于設(shè)置串口讀寫超時(shí);writeSyncPort 方法用于向串口寫入數(shù)據(jù);至于回調(diào)函數(shù)m OnSeriesRead,是當(dāng)讀線程檢測(cè)到串口有可讀數(shù)據(jù)時(shí),通過(guò)它來(lái)通知用戶讀取數(shù)據(jù)

34、。CCESeries 類的使用流程如圖 l0 2 所示。下面就來(lái)介紹 CCESeries 類的具體實(shí)現(xiàn)過(guò)程。1 為 CCESeries 類添加如下私有變量,用于CCESeries 類內(nèi)部使用,代碼如程序清單10 1所示。是第 10 章串口編程3612-購(gòu)用WritrSvncPort方法向串口寫X數(shù)據(jù)i3,凋用Close Port關(guān)閉帶口圖 10. 2 CCESeries 類使用流程圖/ +程序 清 單 10 + +/private/已打開(kāi)的串口句柄。HANDLE m_hComm ;/讀線程句柄12/ 59HANDLE m_hReadThread ;/讀線程 ID 標(biāo)識(shí)DWORD m_dwRea

35、dThreadlD;/讀線程退出事件HANDLE m_hReadCloseEvent ;BOOL m bOpened ; /串口是否打開(kāi)void+m pOwner j /指定父對(duì)象指針 / + + + + + + +/a 2定義串口接收數(shù)據(jù)回調(diào)函數(shù),該回調(diào)函數(shù)供外部使用者調(diào)用。執(zhí)行該回調(diào)函數(shù)時(shí),表 示接收到了串口數(shù)據(jù),請(qǐng)求做出相應(yīng)處理。首先在 CCESeries 類定義外部定義串口接收數(shù)據(jù)函數(shù)類型,代碼如下:/定義串口接收數(shù)據(jù)函數(shù)類型typedef void(CALLBACK+ONSERIESREAD(void+pOwner / + 父對(duì)象指針 +/,BYTE*buf/*接收到的緩沖區(qū)+/,D

36、WORD dwBufLe/接收到的緩沖區(qū)長(zhǎng)度 +/ ;接著,為 CCESeries 類添加一個(gè)串口接收數(shù)據(jù)函數(shù)變量,此變量聲明為共有,供外部使 用。定義如下:public :ONSERIESREAD m onseriesRead ; /串口讀取回調(diào)函數(shù)3實(shí)現(xiàn) CCESeries 類構(gòu)造函數(shù)和析構(gòu)函數(shù),在構(gòu)造函數(shù)里將m hComn 初始化為無(wú)效句睛;在析構(gòu)函數(shù)中,如果檢測(cè)到串口是打開(kāi)的,則關(guān)閉串口。CCESeries 類構(gòu)造函數(shù)和析構(gòu)函牧的實(shí)現(xiàn)如程序清單 10. 2 所示。/ 程序清單 10 ?柑/構(gòu)造函數(shù)CCESeries : : CCESeries(/初始化內(nèi)部變量m hComm=INVAL

37、ID HANDLE V ALUE ; m_OnSeriesRead 2 NULL ; m_bOpened 20; 析構(gòu)函數(shù) 。CCESeries :一 CCESeries(if(m bOpened關(guān)閉串口ClosePort( ; +13/ 59+4 為 CCESeries 類添加串口接收數(shù)據(jù)線程函數(shù)ReadThreadFunc ,該線程用于異步接口數(shù)據(jù)。讀者應(yīng)仔細(xì)理解該線程的具體實(shí)現(xiàn)過(guò)程?該線程通過(guò)循環(huán)調(diào)用 WaitCommEvent來(lái)檢測(cè)串口狀態(tài),當(dāng)發(fā)現(xiàn)有數(shù)據(jù)時(shí),調(diào)用: ReadFile 函數(shù)讀取數(shù)據(jù),并觸發(fā)給回調(diào)函 數(shù), 實(shí)現(xiàn)串口數(shù)據(jù)的實(shí)時(shí)異步讀取。 ReadThreadF 岫 c 函數(shù)被

38、定義成私有靜態(tài)。定義如下: Private :串口讀線程函數(shù)static DWORD WINAPI ReadThreadFunc(LPVOID iparam ;讀線程函數(shù)的實(shí)現(xiàn)如程序清單 10-3 所示。/ 妥程序清單 103*+/串口讀線程函數(shù)DWORD CCESerie:s : ReadThreadFunc(LPVOID iparam(CCESeries*ceSeries=(CCESeries+iparam ;DWORD eVtMaskjBYTE+readBuf=NULL; /讀取的字節(jié)DWORD actualReadLen=0 /實(shí)際讀取的字節(jié)數(shù)DWORD wiliReadLen;DWO

39、RD dwReadErrors; cOMSTAT cmstate;/清空緩沖,并檢查串口是否打開(kāi)收串 函塾 由岀:I14/ 59ASSERT(ceSeries 一m_hComm!=INVALI HANDLV第 10 章串口編程 363PurgeComm(ceSeries m_hComm PURGRXCLEAR I PURGTXCLEARjSetCommMask(ceSeries 一 m hComm EV RXCHAR l EV CTS l EV DSRj while(TRUEif(WaitCommEvent(ceSeries m hComm& evtMask , 0SetCommMas

40、k(ceSeries一m hComr, EV RXCHAR I EV CTS I EV DSR ;15/ 59/表示串口收到字符if(evtMaskf& EV RXCHARClearCommError(ceSeries m_hComm &dwReadErrors , &cmStatej wi l iReadLen=cmState. cblnQue ;if(wiliReadLe ncontinue ;/分配內(nèi)存readBuf= new BYTEwillReadLe n;ZeroMemory(readBuf , willReadLen ;/讀取串口數(shù)據(jù)ReadFile(ce

41、Series 一 m_hComm readBuf, willReadLen , &actualReadLen , 0;/如果讀取的數(shù)據(jù)大于0if(actualReadLe n0readBuf , actualReadLenj/觸發(fā)讀取回調(diào)函數(shù)if(ceSeries-m _On SeriesRead黧麓豳薯圈豳ceSeries 一 m_OnSeriesRead(ceSeries 一 m_pOwner/釋放內(nèi)存delete】readBufjreadBuf=NULLj/如果收到讀線程退出信號(hào),則退出囊煳霜翻豳圜圈豳黼翩醺黼if(WaitForSingleObject(ceSeries mhR

42、eadCloseEvent, 500。break ;WAIT_OBJECT_016/ 59364鱗徽嘲蛹朦Windows CE 嵌入式高級(jí)編程及其實(shí)例詳解(用 C+實(shí)現(xiàn)return 0 ; 5 為 CCESeries 類添加關(guān)閉接收數(shù)據(jù)線程私有函數(shù) CloseReadThread 。當(dāng)使用完串口 后, 便調(diào)用這個(gè)函數(shù)退出串口數(shù)據(jù)接收線程。該函數(shù)的定義如下:private :關(guān)閉讀線程VOid CloseReadThread( ;CloseReadThread 函數(shù)的實(shí)現(xiàn)如程序清單 l 0 4 所示。 + 程 序 清 單 l0 一+ +/關(guān)閉讀線程void CCESeries : CloseRe

43、adThread(SetEvent(m hReadCloseEvent ; /設(shè)置所有事件無(wú)效無(wú)效SetCommMask(m_hComm, 0; /清空所有將要讀的數(shù)據(jù)PurgeComm(m hComm, PURGE RXCLEAR;/等待 4 秒,如果讀線程沒(méi)有退出,則強(qiáng)制退出if(waitForsingleObject(m hReadThread, 4000=WAITTIMEOUTTerminateThread(m hReadThread , 0;m hReadThread=NULL;/ 士+/6 為 類 CCESeries 添 加 0perffort 公 有方 法 , 供外 部調(diào) 用 此

44、方法 打 開(kāi) 串口 。 0perffort方 I將根據(jù)指定的參數(shù)打開(kāi)串口,并創(chuàng)建此串口的讀線程,以實(shí)現(xiàn)串口數(shù)據(jù)實(shí)時(shí)異步讀操作。 OpenPort 方法定義如下:public :|f 瓠殲卑nBOOL OpenPort(void+pOwner ,UINT portNo=1 ,UINT baud=9600 ,UINT parity=NOPARITY ,UINT databits=8 ,17/ 59UINT stopbits=O18/ 59/ *波特率*/ *奇偶校驗(yàn)+/ *數(shù)據(jù)位*/*停止位*/X/設(shè)置串口名wsprintf(szPort , L” CO 眺 d:”,portNo ;/打開(kāi)串口m

45、hComm=CreateFile(SzPort ,GENERIC READ l GENERIC_WRITE/允許讀和寫0,/獨(dú)占方式(共享模式NULL ,OPEN EXISTING,/打開(kāi)而不是創(chuàng)建(創(chuàng)建方式0 ,NULLjif(m_hComm=INVALID HANDLVALUE/無(wú)效句柄,返回TRACE 一 T(” CreateFile 返回?zé)o效句柄 n,; return FALSE ; ;/* *指向父指針*/+串口號(hào)+/ *波特率*/ *奇偶校驗(yàn)+/ +數(shù)據(jù)位+/*停止位*/Open Port 方法的實(shí)現(xiàn)如程序清單10-5 所示。/5+/*函數(shù)介紹:*入口參數(shù):portNO嬲嬲啜 鬃黲

46、/攀蔓譬打開(kāi)串口pPortOwner :使用此串口類的窗體句柄:串口號(hào)第10克串口編程程戶筍清單10paritydatabitsstopbits*出口參數(shù):19/ 59Windows CE高思址直實(shí)閔詳解用 G*雲(yún)叱丿/甞劉打幵申口的肖前Mtllfc 槪戰(zhàn)后再更新設(shè)建口i ftiGetCommState(m. hCorjn,. EcommParam) 關(guān)儺串口CloseMridle (m_hCMnm)im hComm=INVALI D- HANDL VALUEreturn FALSE j/設(shè)置串口參數(shù)commParam BaudRate=baud ; commParam fBinary=TRU

47、E ;commParam fParity=TRUE ; commParam ByteSize=databitS ;commParam ParitY 2 paritY ; commParam StopBits=StopbitS;/設(shè)置波特率/設(shè)置二進(jìn)制模式,此處必須設(shè)置為 /支持奇偶校驗(yàn)/數(shù)據(jù)位,范圍:48/校驗(yàn)?zāi)J?停止位commParam fOutxCtsFlow=FALSE ; commParamfOutxDsrFlow=FALSE ;commParam fDtrContr01=DTR CONTROL ENABLE j |f DTR flowcon tr01 type/ NOXO/XOFF

48、 outflowcontrolI / NoXON/XOFFin flowcontrolcommParam fRtsControl=RTS CONTROL ENABLEj f / RTS flow con trolcomParam fAb。rtOnErr。r: FALSE/當(dāng)串口發(fā)生錯(cuò)誤時(shí)并不終止串口讀寫/設(shè)置串口參數(shù)if(!SetCommState(m hComm , &commParam TRACE(T( SetCommState error ” ;/關(guān)閉串口ClOSeHandle(m hComm ;m hComm=INVALID HANDL VALUEreturn FALSE ;1

49、/設(shè)置串口讀寫時(shí)間COMMTIMEOUTS CommTimeOutSGetCommTimeouts(m hComn, &CommTimeOutscommParam fDsrSe nsitivity=FALSE/ DSR sensitivitycommParam fTXContinueOnXoff=TRUE ;/ XOFF continues TxcommParam fErrorChar=FALSEj/ Disable error replacementcommParam fNull=FALSE/ Disable null strippingTRUE/ No CTS output flo

50、w control/ No DSR output flow controlcommParam fOutX=FALSE;commParam fInX=FALSE;20/ 59第 10 章串口編程 367CommTimeOutS ReadIntervalTimeoUt=MAXDWORDCommTimeOutS ReadTotalTimeoutMultiplier=0 ;CommTimeOutS ReadTotalTimeoutConstant=O ;CommTimeOutS WriteTotalTimeoutMultiplier=10;CommTimeOutS WriteTotalTimeoutC

51、onstant=1OOO;if(!SetCommTimeoutS(m hComm,& CommTimeOutSTRACE(T( SetCommTimeouts 返回錯(cuò)誤” j/關(guān)閉串口CloseHa ndle(m hCommjm hComm INVALI D HANDLVALUEreturn FALSE ;/指定端口監(jiān)測(cè)的事件集。SetCommMask(m hCommEV RXCHAR/分配串口設(shè)備緩沖區(qū):。SetupComm(m hComm 512, 512;/初始化緩沖區(qū)中的信息PurgeComm(m hComPURGE TXCLEAR I PURGE RXCLEARjCStri

52、ng strEve nt;StrEvent . Format(L” Com ReadCloseEven 堤 d”, portNojm hReadCloSeEvent=CreateEvent(NULL , TRUE FALSE StrEvent ;/創(chuàng)建串口讀數(shù)據(jù)監(jiān)聽(tīng)線程m hReadThread=CreateThread(NULL f 0 , ReadThreadFunc , this l o f&m dwReadThreadID;TRACE(T(,-串口打開(kāi)成功- ;m bOpe ned=TRUE。return TRUE ;/21/ 59/7 為 CCESeries 類添加 Clos

53、ePort 公有方法,供外部調(diào)用來(lái)關(guān)閉串口。ClosePort 方2_勺訥坤(托懂入式高最堀程及苴蟲例詳解(用實(shí)班】*7void CCESeries : : ClosePort( /表示串口還沒(méi)有打開(kāi)if(mhComm=2 INVALID- HANDLVALUEfretu,rn ;/關(guān)閉讀線程CloseReadThread( ;/關(guān)閉串口CloseHa ndle(m hCommj/關(guān)閉事件CloseHandle(m hReadCl。seEvent ;mhCom 2 INVALIDHANDLEVALUE jm_bOpened=FALSE ;/ +舟+ +/8 為 CC ES,eries 類添加

54、WriteSyncPort 公有方法,供外部調(diào)用來(lái)向串口發(fā)送數(shù) 據(jù)。WriteSy ncPort 方法的定義如下:public :/同步寫入數(shù)據(jù)BOOL WriteSyncPort(const BYTE*buf, DWORD bufLenWfiteSyncPort方法的實(shí)現(xiàn)如程序清單 l0 . 7 所示。/ 程序清單 l0?/法將退出串口讀線程,并關(guān)閉串口句柄。ClosePort 方法定義如下:public :/關(guān)閉串口void ClosePort( ;22/ 59/7+ 函數(shù)介紹:往串口寫入數(shù)據(jù)+ 入口參數(shù): bur :待寫入數(shù)據(jù)緩沖區(qū) bufLen :待寫入緩沖區(qū)長(zhǎng)度 + 出口參數(shù): (

55、無(wú) +返回值:TRUE 設(shè)置成功;FALSE 設(shè)置失敗+ BOOL CCESeries : :WriteSyncPort(const BYTE buf ,DWORDdwNumBytesWrittenjDWORD dwHaveNumWritten : 0jint ilnc=0;如果 3 次寫入不成功,返回 FALSEAssERT(m hComm l 5 INVALID_HANDLEVALUEj doif(WriteFile(m_hComm , , 口句柄buf+dwHaVeNumwritten , 被寫數(shù)據(jù)緩沖區(qū) bufLen dwHaveNumWritten,被寫數(shù)據(jù)緩沖區(qū)大小DWORD bu

56、fLen23/ 59第 10 章串口編程 369& dwNumBytesWri 七 ten ,NULL/函數(shù)執(zhí)行成功后,返回實(shí)際向串口寫的個(gè)數(shù)/此處必須設(shè)置為 NULLdwHaveNumWritte n=dwHaveNumWritte n 4/寫入完成if(dwHaveNumWritte n=bufLe nbreakjiIn c+jif(iI nc=3(return FALSE ;Sleep(10je1Sereturn FALSE ;while(TRUE ; 嘲return TRUE ;dwNumBytesWritten ;露一懣翻闡/+/9 為 CCESeries 類添加 SetSe

57、riesTimeouts 公有方法,供外部調(diào)用來(lái)設(shè)置串口讀取、 寫入超時(shí)。SetSeriesTimeouts 函數(shù)的定義如下:public :/設(shè)置串口讀取、寫入超時(shí)疆BOOL SetSeriesTimeoutS(COMMTIMEOUTS24/ 59CommTimeOut s):SetSfrks llmeouts雷數(shù)的實(shí)現(xiàn)如崔序淸單10-8所幾. .程序淸眼LA日 n/*嘯戴介紹:設(shè)就串口讀聯(lián).耳人超時(shí)口察敵:COrnnTirnethitS;捋向COMHTIME0UTS佶構(gòu)佶構(gòu)出擦St: f無(wú)逅回價(jià):TfiUEc股賈戰(zhàn)功:FALSEi設(shè)置先歆*/00QL CCESerios; ;setstri

58、esTjmeoUtSGetComOpened(i25/ 59GetComOpenec 函數(shù)的實(shí)現(xiàn)如程序清單10-9 所示。/ 程序清單 10 /得到串口是否打開(kāi)BOOL CCESeries:: GetComOpened(retur n m_bOpe ned ;J/ +/至此,CCESeries 類就編寫完成了。下面將基于CCESeries 類來(lái)演示如何使用它進(jìn)行實(shí)際的串口通訊。(3 建立串口參數(shù)輸入對(duì)話框。串口參數(shù)輸入對(duì)話框用于在打開(kāi)串口時(shí),選擇正確的串口參數(shù),例如串口號(hào)、波特率、奇偶檢驗(yàn)等。串口號(hào)表示使用的是機(jī)器上哪個(gè)串口,波特率、奇偶檢驗(yàn)等參數(shù)一般由設(shè)備廠家提供。這些參數(shù)都是極其重要的,因

59、此應(yīng)給予足夠的重視。1 利用 MFC 類向?qū)陆?CDIgParams 對(duì)話框。設(shè)計(jì)樣式如圖 10 . 3 所示。未口:圖 10-3 “串口參數(shù)”輸入對(duì)話框?qū)υ捒蛏系目丶捌鋵傩栽O(shè)置如表 10. 9 所示。 表 10. 9 串口參數(shù)輸入框界面控件及其屬性設(shè)置表標(biāo)識(shí) ID屬性DCCMBCOMNO下拉框控件,用于設(shè)置串口號(hào)。屬性Type 設(shè)置為 Drop List ,屬性 Sort設(shè)置為 False26/ 59IDC . CMBCO BAUD卜拉框控件,用于設(shè)置串口波特率。屬性Type 設(shè)置為 Drop List ,屬性Sort設(shè)置為 FalseIDC-CMB-COM.PARITY卜拉框控件,用于

60、設(shè)置串121 校驗(yàn)位。屬性 Dpe 設(shè)置為 Drop List ,屬性Sort設(shè)置為 FalseIDC_CMB Co OM_DATABITS卜拉框控件,用于設(shè)置串口數(shù)據(jù)位。屬性Type 設(shè)置為 Drop List ,屬性Sort設(shè)置為 FalseIDC_CMB_COM_STOPBITS下拉框控件,用于設(shè)置串口停止位。屬性Type 設(shè)置為 Drop List,屬性 Sort設(shè)置為 FalseIDC BTM OK按鈕控件,標(biāo)題設(shè)為“確定”DCBTN . CANCEL按鈕控件,標(biāo)題設(shè)為“取消”2為 CDIgParams 類添加如下公有變量,用于存儲(chǔ)設(shè)置好的串口參數(shù)。第 10 章串口編程 371publlC :f fUINT m_portNO ; f f 卑 Iq 號(hào)UINT m

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論