WIN32串列埠程式設計詳解 二

2021-07-02 14:36:30 字數 3473 閱讀 3249

4.2 同步方式讀寫串列埠:

下面先例舉同步方式讀寫串列埠的**:

//同步讀串列埠

char str[100];

dword wcount;//讀取的位元組數

bool breadstat;

breadstat=readfile(hcom,str,100,&wcount,null);

if(!breadstat)

return true;

//同步寫串列埠

char lpoutbuffer[100];

dword dwbyteswrite=100;

comstat comstat;

dword dwerrorflags;

bool bwritestat;

clearcommerror(hcom,&dwerrorflags,&comstat);

bwritestat=writefile(hcom,lpoutbuffer,dwbyteswrite,& dwbyteswrite,null);

if(!bwritestat)

purgecomm(hcom, purge_txabort|

purge_rxabort|purge_txclear|purge_rxclear);

4.3 重疊操作:

操作還未完成函式就返回。

dword  internal;

dword  internalhigh;

dword  offset;

dword  offsethigh;

handle hevent;

當呼叫readfile, writefile 函式的時候,該成員會自動被置為無訊號狀態;當重疊操作完成後,該成員變數會自動被置為有訊號狀態。

handle hfile, // 串列埠的控制代碼

// 指向乙個32位變數,該變數的值返回實際讀寫操作傳輸的位元組數。

lpdword lpnumberofbytestransferred, 

// 該引數用於指定函式是否一直等到重疊操作結束。

// 如果該引數為true,函式直到操作結束才返回。

// 如果該引數為false,函式直接返回,這時如果操作沒有完成,

// 通過呼叫getlasterror()函式會返回error_io_incomplete。

bool bwait    

);    

4.4 非同步讀串列埠的示例**:

char lpinbuffer[1024];

dword dwbytesread=1024;

comstat comstat;

dword dwerrorflags;

m_osread.hevent=createevent(null,true,false,null);

clearcommerror(hcom,&dwerrorflags,&comstat);

dwbytesread=min(dwbytesread,(dword)comstat.cbinque);

if(!dwbytesread)

return false;

bool breadstatus;

breadstatus=readfile(hcom,lpinbuffer,

dwbytesread,&dwbytesread,&m_osread);

if(!breadstatus) //如果readfile函式返回false

return 0; }

purgecomm(hcom, purge_txabort|

purge_rxabort|purge_txclear|purge_rxclear);

return dwbytesread;

對以上**再作簡要說明:

在使用readfile 函式進行讀操作前,應先使用clearcommerror函式清除錯誤。clearcommerror函式的原型如下:bool clearcommerror(

handle hfile, // 串列埠控制代碼

lpdword lperrors,       // 指向接收錯誤碼的變數

lpcomstat lpstat // 指向通訊狀態緩衝區

);    

該函式獲得通訊錯誤並報告串列埠的當前狀態,同時,該函式清除串列埠的錯誤標誌以便繼續輸入、輸出操作。

引數lpstat指向乙個comstat結構,該結構返回串列埠狀態資訊。

comstat結構

comstat結構包含串列埠的資訊,結構定義如下:

typedef struct _comstat comstat, *lpcomstat;

本文只用到了cbinque成員變數,該成員變數的值代表輸入緩衝區的位元組數。

最後用purgecomm函式清空串列埠的輸入輸出緩衝區。

char lpinbuffer[1024];

dword dwbytesread=1024;

bool breadstatus;

dword dwerrorflags;

comstat comstat;

clearcommerror(hcom,&dwerrorflags,&comstat);

if(!comstat.cbinque)

return 0;

dwbytesread=min(dwbytesread,(dword)comstat.cbinque);

breadstatus=readfile(hcom, lpinbuffer,dwbytesread,

&dwbytesread,&m_osread);

if(!breadstatus) //如果readfile函式返回false

return 0; }

return dwbytesread;

非同步寫串列埠的示例**:

char buffer[1024];

dword dwbyteswritten=1024;

dword dwerrorflags;

comstat comstat;

bool bwritestat;

bwritestat=writefile(hcom,buffer,dwbyteswritten,

&dwbyteswritten,&m_oswrite);

if(!bwritestat)

return 0; }

return dwbyteswritten;

5.關閉串列埠

利用api函式關閉串列埠非常簡單,只需使用createfile函式返回的控制代碼作為引數呼叫closehandle即可:

bool closehandle(

handle hobject; //handle to object to close );

WIN32串列埠程式設計詳解 二

4.2 同步方式讀寫串列埠 下面先例舉同步方式讀寫串列埠的 同步讀串列埠 char str 100 dword wcount 讀取的位元組數 bool breadstat breadstat readfile hcom,str,100,wcount,null if breadstat return ...

Win32串列埠程式設計

win32串列埠程式設計 金貝貝 一 基本知識 win32下串列埠通訊與16位串列埠通訊有很大的區別。在win32下,可以使用兩種程式設計方式實現串列埠通訊,其一是呼叫的windows的api函式,其二是使用activex控制項。使用api 呼叫,可以清楚地掌握串列埠通訊的機制,熟悉各種配置和自由靈...

win32 串列埠 通訊 非同步 執行緒方式

該例子是 visual c 實踐與提高 串列埠通訊與工程應用篇 第2版 書上給出的部分原始碼,整理修改之後的演示 借助 tc35模組可以,正常執行 如下 seritaltk.cpp 定義控制台應用程式的入口點。include stdafx.h include handle hcom dword th...