造冰箱的大熊貓@cnblogs 2019/1/27
將windows下串列埠程式設計相關資訊進行下簡單小結,以備後用。
1、開啟串列埠
開啟串列埠使用createfile()函式。以開啟com6為例:
handle hcomm;hcomm = createfile( text("
com6
"), generic_read | generic_write, 0, null, open_existing, file_attribute_normal, null );
其中:- "com6"
,待開啟串列埠的串列埠名。
- generic_read | generic_write,串列埠讀寫許可權。
- 0,固定值。
- null,指向security_attributes的指標。通常設定為null,此時createfile()函式返回的控制代碼不能被子程序繼承。
- open_existing,固定值。
- file_attribute_normal,檔案屬性。
- null,固定值。
- hcomm,函式返回的控制代碼。如果開啟串列埠成功,則在後續操作中使用該控制代碼訪問串列埠。如果開啟串列埠失敗,函式返回控制代碼為invalid_handle_value。
這裡兩點需要說明:
一是createfile()、createfilea()[1]和createfilew()[2]的區別。在大部分說明如何使用win32 api開啟串列埠的文件中都介紹用createfile()函式開啟串列埠,但某些文件中卻使用createfilea()或createfilew()函式。實際上三個函式的功能是相同的,只是所採用的字串編碼格式不同。createfilea()函式名中的a代表ansi,而createfilew()中的w代表unicode。所謂ansi編碼,是各國根據自己的語言定義的字元編碼格式,其中0~0x7f與ascii字元相同,其餘則與具體語言相關。因此,中文ansi編碼(gb2312)和日文ansi編碼無法互通。unicode則是將所有語言的編碼進行統一,用同乙個編碼空間覆蓋所有語言文字。從下面的**中可以清楚地看出三個函式的關係。 在前面createfile()示例中,text巨集的用途就是根據當前作業系統的編碼格式對字串"com6"進行適當的格式轉換。
handle createfilea(__in lpcstr lpfilename,
__in dword dwdesiredaccess,
__in dword dwsharemode,
__in_opt lpsecurity_attributes lpsecurityattributes,
__in dword dwcreationdisposition,
__in dword dwflagsandattributes,
__in_opt handle htemplatefile
);handle createfilew(
__in lpcwstr lpfilename,
__in dword dwdesiredaccess,
__in dword dwsharemode,
__in_opt lpsecurity_attributes lpsecurityattributes,
__in dword dwcreationdisposition,
__in dword dwflagsandattributes,
__in_opt handle htemplatefile
);#ifdef unicode
#define createfile createfilew
#else
#define createfile createfilea
#endif
二是對於串口號大於9的串列埠
(例如com12)
,在createfile()函式中串列埠名應寫作"\.\com12"。
2、關閉串列埠
關閉串列埠則使用closehandle()函式。示例如下:
closehandle(hcomm);
3、配置串列埠工作引數
以設定串列埠為波特率115200,資料位8bit,停止位1bit為例:
dcb dcb;getcomm(hcomm, &dcb);
dcb.baudrate =cbr_115200;
dcb.bytesize = 8
;dcb.stopbits =onestopbit;
setcommstate(hcomm, &dcb);
4、寫串列埠
以傳送字串"abcd"為例:
char buf = "abcd";
dword buf_len = 4; //
待寫入串列埠的位元組數
dword written_cnt; //
實際寫入串列埠的位元組數
wretefile( hcomm, (
void *)buf, buf_len, &written_cnt, null );
5、讀串列埠
以讀取12個字元為例:
char buf[128];dword toread_cnt = 12; //
要從串列埠讀入的位元組數
dword read_cnt; //
實際從串列埠讀入的位元組數
readfile( hcomm, (
void *)buf, toread_cnt, &read_cnt, null );
6、清除串列埠緩衝區
當串列埠接收到乙個位元組時,串列埠驅動程式將接收到的位元組寫入記憶體的某個位置(輸入緩衝區)。當應用程式讀取串列埠時,作業系統按照「先進先出」的原則從輸入緩衝區取出資料交給應用程式。在某些應用場景下,應用程式需要捨棄輸入緩衝區內當前資料。這可通過purgecomm()函式實現。
purgecomm( hcomm, purge_rxclear );
7、其它
在windows作業系統中,計算機上實際存在的或者虛擬的通訊埠,包括串列埠和並口等,統稱為通訊資源(communication resource)。本文總結的串列埠程式設計資訊對通訊資源也是適用的。
Windows串列埠程式設計
一 基本知識 win32下串列埠通訊與16位串列埠通訊有很大的區別。在win32下,可以使用兩種程式設計方式實現串列埠通訊,其一是呼叫的windows的api函式,其二是使用activex控制項。使用api 呼叫,可以清楚地掌握串列埠通訊的機制,熟悉各種配置和自由靈活採用不同的流控進行串列埠通訊。下...
Windows 下串列埠程式設計
經常需要用到windows下的串列埠工具。某些時候,現有的工具不能滿足需求,於是需要自己開發寫個串列埠小工具,來完成某些操作。windows下串列埠工具的源 很多,有用cserial類的,有用mfc串列埠控制項的。個人感覺,都不是很好用。甚至有時候只要要個命令列下的串列埠工具,不需要介面,敲入不同的...
Windows下串列埠程式設計
造冰箱的大熊貓 cnblogs 2019 1 27 將windows下串列埠程式設計相關資訊進行下簡單小結,以備後用。1 開啟串列埠 開啟串列埠使用createfile 函式。以開啟com6為例 handle hcomm hcomm createfile text com6 generic read...