[問題] SerialPort讀取長度

作者: getaway (夏天快走!!!)   2020-05-28 19:08:33
直接切入正題
訪問COM Port使用了
CreateFile
ReadFile
WriteFile..等Win32 API函式
用到"ReadFile"做讀取時發現一個跟以前
使用C# Serial.Read很不一樣的地方搞不太懂
問題1.
C#使用 Serial.Read時可以以BytesToRead被動決定要讀取時的指定長度,
反之在C/C++使用ReadFile反而是要指定主動決定要讀取多長,
可是使用者如果不知道回傳資料長度如何指定?
BOOL WINAPI ReadFile(
__in HANDLE hFile,
__out LPVOID lpBuffer, // 字串Buffer
__in DWORD nNumberOfBytesToRead, // 要讀取的Byte數
__out LPDWORD lpNumberOfBytesRead, // API回填已讀取Byte數
__in LPOVERLAPPED lpOverlapped // OVERLAPPED
);
作者: SeamusBerloz (軒摩斯)   2020-05-28 19:51:00
lpNumberOfBytesRead 不就是回傳長度嗎?nNumberOfBytesToRead 應該是指最多不要超過此長度吧。
作者: annheilong (方格子)   2020-05-28 23:30:00
一種做法是跟他說buffer大小,然後看實際讀多少回來通常protocol讀完head後面 會再讀取後續資料長度例如讀完0x02 head後,再讀2 bytes知道剩下多長(不含tail跟CRC所以讀到1 byte 0x02後,再讀2 bytes知道後面長度然後回圈讀取後面長度 讀完再讀tail跟CRC
作者: getaway (夏天快走!!!)   2020-05-29 02:18:00
開心,原本還擔心不知道達人我在問什麼,看完回覆後有一些可以嘗試的想法了,以protocol來處理也可以,只是蠻確定以前處理C#時的ByteToRead在溝通介面上就已經預知stdin buffer可以讀進的資料長度
作者: kobe8112 (小B)   2020-05-29 11:55:00
因為那不是預知啊...那是已經放在緩衝區的資料
作者: getaway (夏天快走!!!)   2020-06-03 11:20:00
補上意外發現的處理方式但未經驗證SetCommMask跟WaitCommEvent有興趣的參考如右邊連結 https://reurl.cc/L3DxkX

Links booklink

Contact Us: admin [ a t ] ucptt.com