上下位機通訊的時候,常常需要用到串列埠通訊。串列埠通訊的兩種操作方式:同步(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...