作者getaway (夏天快來!)
看板C_and_CPP
標題[問題] SerialPort讀取長度
時間Thu May 28 19:08:33 2020
直接切入正題
訪問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
);
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.137.74.217 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1590664120.A.6B9.html
1F:推 SeamusBerloz: lpNumberOfBytesRead 不就是回傳長度嗎? 05/28 19:51
2F:→ SeamusBerloz: nNumberOfBytesToRead 應該是指最多不要超過此長度 05/28 19:52
3F:→ SeamusBerloz: 吧。 05/28 19:52
4F:→ annheilong: 一種做法是跟他說buffer大小,然後看實際讀多少回來 05/28 23:30
5F:→ annheilong: 通常protocol讀完head後面 會再讀取後續資料長度 05/28 23:31
6F:→ annheilong: 例如讀完0x02 head後,再讀2 bytes知道剩下多長(不含 05/28 23:32
7F:→ annheilong: tail跟CRC 05/28 23:32
8F:→ annheilong: 所以讀到1 byte 0x02後,再讀2 bytes知道後面長度 05/28 23:33
9F:→ annheilong: 然後回圈讀取後面長度 讀完再讀tail跟CRC 05/28 23:34
10F:→ getaway: 開心,原本還擔心不知道達人我在問什麼,看完回覆後有一 05/29 02:18
11F:→ getaway: 些可以嘗試的想法了,以protocol來處理也可以,只是蠻確 05/29 02:18
12F:→ getaway: 定以前處理C#時的ByteToRead在溝通介面上就已經預知stdi 05/29 02:18
13F:→ getaway: n buffer可以讀進的資料長度 05/29 02:18
14F:→ kobe8112: 因為那不是預知啊...那是已經放在緩衝區的資料 05/29 11:55
15F:→ getaway: 補上意外發現的處理方式但未經驗證SetCommMask 06/03 11:20
16F:→ getaway: 跟WaitCommEvent 06/03 11:21