WindowAPI串列埠通訊

2021-07-02 16:55:08 字數 1937 閱讀 2528

上下位機通訊的時候,常常需要用到串列埠通訊。串列埠通訊的兩種操作方式:同步(api阻塞等到操作完成返回,阻塞監聽執行緒)和非同步(api函式立即返回,操作在後台完成)操作。

操作流程:開啟串列埠,配置串列埠,讀寫串列埠,關閉串列埠,實現這四個操作就完成了對串列埠的基本操作。

1.開啟串列埠,使用createfile:

使用同步方式開啟串列埠:

handle hcom = createfile("com1",generic_read | generic_write,0,null,open_existing,0,null);

if(hcom == (handle)-1)

使用非同步方式開啟

handle hcom = createfile("com1",generic_read | generic_write,0,null,open_existing,file_attribute_normal|file_flag_overlaped,null);

if(hcom == invalid_handle_value)

2.配置串列埠,

需要使用dcb結構來作為緩衝區,使用getcommstate獲得初始配置,通過修改dcb結構,再呼叫setcommstate.

除了在bcd中對串列埠配置,程式需要設定i/o緩衝區大小和超時。通訊速率高則緩衝區大,使用setupcomm函式來進行設定。

超時的作用是在讀寫串列埠時,在指定時間內沒有完成對應的讀寫操作則退出操作。

讀寫串列埠超時有間隔超時(接受時兩個字元間最大延時)和總超時(讀寫總共花費最大時間)。讀操作支援兩種超時,寫操作只支援總超時。

commtimeouts結構體:總超時時間= 時間係數*要求讀寫字元數+時間常量

setupcomm(hcom,1024,1024);

commtimeouts timeouts;

//設定讀超時

timeouts.readintervaltimeout = 1000;

//讀間隔

timeouts.readtotaltimeoutmultiplier= 500;

//時間係數

timeouts.readtotaltimeoutconstant= 5000;

//常量

//寫超時類似

dcb dcb;

getcommstate(hcom,&dcb);

dcb.baudrate = 9600;

dcb.bytesize = 8;

dcb.parity = noparity;

dcb.stopbits= twostopbits;

setcommstate(hcom,&dcb);

//清除緩衝區的記憶體

purgecomm(hcom,purge_txcleari|purge_rxclear);

3.讀寫串列埠(readfile 和 writefile)

讀寫串列埠時可以同步或非同步執行。同步執行的效率會下降。由建立creatfile得到的控制代碼來判斷是同步執行還是非同步執行。

同步讀寫串列埠:

char str[100];

dword wcount;

bool ret;

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

if(!ret)

char buf[100];

dword dwbyteswrite = 100;

comstat comstat;

dword dwerrorflag;

bool ret;

//清除串列埠的錯誤

clearcommerrorh(hcom,&dwerrorflags,&comstat);

ret = writefile(hcom,buf,dwbyteswrite,&dwbyteswrite,null);

if(!ret)

非同步讀寫操作:

4.關閉串列埠使用closhandle來關閉建立的控制代碼。

串列埠通訊 串列埠通訊原理

1 rs232介面 rs232 c介面聯結器一般使用型號為db 9的9芯插頭座,只需3條介面線,即 傳送資料 接收資料 和 訊號地 即可傳輸資料,其9個引腳的定義如圖11 3所示。圖11 3 rs232 c介面聯結器定義 在rs232的規範中,電壓值在 3v 15v 一般使用 6v 稱為 0 或 o...

串列埠同步通訊和串列埠非同步通訊

串列埠掃盲貼 現實中不存在絕對精確的時鐘,標稱值同樣是1mhz,發端和接收端的時鐘總會存在差異,如果接收端不進行時鐘同步,而是使用自己本地的時鐘,則足夠長的時間後接收到的資料總會出現不可預知的重複或丟失,導致接收錯誤。因此發端必須將與資料速率相關的時鐘訊號傳輸給接收端,時鐘訊號可以走單獨的訊號線,也...

WINDOW API 複製檔案

用.net 的file.copy函式複製函式時,如果檔案時開啟的,或者在程式中有開啟,用該函式時經常出錯,想想呼叫window 的api 函式應該不會出現這種檔案,今天就做了一下實驗,可以解決該檔案 api 有兩個複製檔案的函式,第一種 copyfileex 可以顯示進度條,第二種 copyfile...