[問題] Win7 mingw COM program

作者: ck49 (心動)   2016-04-05 13:43:45
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
Win7 x64 MINGW
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
#include <windows.h>
問題(Question):
在讀取 COM port 時使用
ReadFile(Cport[comport_number], buf, size, (LPDWORD)((void *)&n), NULL);
時若設定
COMMTIMEOUTS Cptimeouts;
Cptimeouts.ReadIntervalTimeout = MAXDWORD;
Cptimeouts.ReadTotalTimeoutMultiplier = 0;
Cptimeouts.ReadTotalTimeoutConstant = 5000; //5000 ms
Cptimeouts.WriteTotalTimeoutMultiplier = 0;
Cptimeouts.WriteTotalTimeoutConstant = 5000; //5000 ms
此設定是每五秒檢查一次,不符合需求,
例如在2秒時有資料,要等到5秒時才讀到。
若設為0,則會造成cpu耗盡的狀況,
請教是否有更好的讀取方法?
感恩
作者: Schottky (順風相送)   2016-04-05 14:17:00
是可以設定成收到 "1 byte" 就立刻回傳,請看 MSDN不過這個行為是你要的嗎? 還是你喜歡整份資料收到完?設成 0.1 秒 (5000 改成 100) 試試看
作者: twitcha101 (twitch)   2016-04-05 14:37:00
你的ReadFile有搭配Thread嗎?另外這個timeout是你在接收佇列裡面字元與字元間的等待最大間隔,超過則返回動作
作者: Schottky (順風相送)   2016-04-05 17:02:00
這樣就設定成有資料立刻回傳,沒資料 block 住就好了MSDN 的說明有寫該怎麼設定有 parser 就好辦了,我也是傾向這種解法
作者: twitcha101 (twitch)   2016-04-05 17:17:00
要設成0就要用,waitcommevent這類去卡 thread,不然就要加 delay 在 thread 裡
作者: Schottky (順風相送)   2016-04-05 21:56:00
https://goo.gl/uRxJag 在這一頁,看 Remarks 那一段
作者: ck49 (心動)   2016-04-05 23:02:00
感恩啊 已經ok了

Links booklink

Contact Us: admin [ a t ] ucptt.com