串列埠通訊方法(WINAPI實現)

2021-03-31 17:18:18 字數 2940 閱讀 9915

前言:

程式實現:

我在經過許多的專案的開發和實踐中發現,採用win api函式進行串列埠的開發能夠給程式設計師很大的控制項,並且程式運也很穩定。所以我將與串列埠接觸的函式進行封裝,然後在各個工程中進行呼叫,效果還是比較好的,現將各個函式和呼叫方法列舉出來,希望對各位有所幫助。

一、設定串列埠相關工作

#define        maxblock 2048

#define        xon 0x11

#define        xoff 0x13

bool set***(handle &m_h***, const char *m_sport, int baudrate, int databit, cstring parity, cstring stopbit)

setup***m(m_h***,maxblock,maxblock);              //設定緩衝區

memset(&timeouts,0,sizeof(timeouts));    

timeouts.readintervaltimeout=maxdword;           // 把間隔超時設為最大,把總超時設為0將導致readfile立即返回並完成操作

timeouts.readtotaltimeoutmultiplier=0;           //讀時間係數

timeouts.readtotaltimeoutconstant=0;            //讀時間常量  

timeouts.writetotaltimeoutmultiplier=50;       //總超時=時間係數*要求讀/寫的字元數+時間常量

timeouts.writetotaltimeoutconstant=2000;       //設定寫超時以指定write***m成員函式中的                                              

if(!get***mstate(m_h***, &dcb))               串列埠開啟方式、埠、波特率 與埠匹配的裝置

dcb.fparity=true;                          //允許奇偶校驗        

dcb.fbinary=true;

if(parity=="none")

dcb.parity=noparity;

if(parity=="odd")

dcb.parity=oddparity;

if(parity=="even")

dcb.parity=evenparity;

if(stopbit=="1")//設定波特率

dcb.stopbits=onestopbit;

//if(stopbit=="0")//設定波特率

//    dcb.stopbits=nonestopbit;

if(stopbit=="2")//設定波特率

dcb.stopbits=twostopbits;                            

bool m_becho=false;                        ///

int m_nflowctrl=0;

bool m_bnewline=false;                     ///

dcb.baudrate=baudrate;                     // 波特率

dcb.bytesize=databit;                     // 每位元組位數    

// 硬體流控制設定

dcb.foutxctsflow=m_nflowctrl==1;

dcb.frtscontrol=m_nflowctrl==1    ?rts_control_handshake:rts_control_enable;    

// xon/xoff流控制設定(軟體流控制!)

dcb.finx=dcb.foutx=m_nflowctrl==2;

dcb.xonchar=xon;

dcb.xoffchar=xoff;

dcb.xonlim=50;

dcb.xofflim=50;    

if(set***mstate(m_h***, &dcb))    

return true;          ***的通訊口設定    

else

} 二、讀串列埠操作:

int read***(handle h***m, byte inbuff, dword &nbytesread, int readtime)

}        

}return 1;    

loop:  return 0;

}三、寫串列埠命令

int write***(handle h***m, byte outbuff, int size, int bwrite)

if(dwerror=error_io_in***plete)

continue;          //未完全讀完時的正常返回結果

else

}}      

}    

flushfilebuffers(h***m);

purge***m(h***m,purge_txclear);                

bwrite=0;

return 1;

}四、呼叫方法很簡單,只需要將你的串列埠引數進行簡單的設定就可以了。比如:

bool main_open***()//設定***

void main()

;size=sizeof(outbuff);

write***(m_h***,outbuff,size,bwrite);

read***(m_h***,m_inbuff,bytestoread,readtime);

//進行湘陰的解包處理

} 有了上面的函式的封裝,相信大家程式設計應該能夠方便快捷一些吧。

使用winAPI 串列埠通訊 一

串列埠和其他通訊裝置是作為檔案處理的.簡單的可以採用查詢方式 定時方式 複雜些的可以採用事件驅動的方式.所謂驅動方式,即當有序列資料進入輸入緩衝區時,自動執行接受程式.使用winapi來編寫 串列埠通訊程式時,讀寫操作可以有同步方式與重疊的非同步方式.所謂同步方式,就是當命令發出後,直到資料確實寫入...

使用winAPI串列埠通訊 二

採用同步方式的查詢方式讀取串列埠資料時,若由於串列埠操作耗費較長的時間,則程式會被掛起.為解決這種問題,可以在讀取資料時採用重疊i o操作.此時,讀寫資料的操作在單獨的執行緒中進行,發出讀寫要求的主線程可以繼續執行.當讀寫資料成功後,讀寫資料線程可以通過某種方式通知主線程.兩個執行緒協調工作,可以明...

使用winAPI串列埠通訊 二

採用同步方式的查詢方式讀取串列埠資料時,若由於串列埠操作耗費較長的時間,則程式會被掛起.為解決這種問題,可以在讀取資料時採用重疊i o操作.此時,讀寫資料的操作在單獨的執行緒 中進行,發出讀寫要求的主線程可以繼續執行.當讀寫資料成功後,讀寫資料線程可以通過某種方式通知主線程.兩個執行緒協調工作 可以...