Windows 串列埠程式設計

2022-07-05 12:00:17 字數 3293 閱讀 7622

造冰箱的大熊貓@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...