[問題] SerialPort讀取長度

看板C_and_CPP (C/C++)作者 (夏天快來!)時間5年前 (2020/05/28 19:08), 編輯推噓1(1016)
留言17則, 4人參與, 5年前最新討論串1/1
直接切入正題 訪問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://www.ptt.cc/bbs/C_and_CPP/M.1590664120.A.6B9.html

05/28 19:51, 5年前 , 1F
lpNumberOfBytesRead 不就是回傳長度嗎?
05/28 19:51, 1F

05/28 19:52, 5年前 , 2F
nNumberOfBytesToRead 應該是指最多不要超過此長度
05/28 19:52, 2F

05/28 19:52, 5年前 , 3F
吧。
05/28 19:52, 3F

05/28 23:30, 5年前 , 4F
一種做法是跟他說buffer大小,然後看實際讀多少回來
05/28 23:30, 4F

05/28 23:31, 5年前 , 5F
通常protocol讀完head後面 會再讀取後續資料長度
05/28 23:31, 5F

05/28 23:32, 5年前 , 6F
例如讀完0x02 head後,再讀2 bytes知道剩下多長(不含
05/28 23:32, 6F

05/28 23:32, 5年前 , 7F
tail跟CRC
05/28 23:32, 7F

05/28 23:33, 5年前 , 8F
所以讀到1 byte 0x02後,再讀2 bytes知道後面長度
05/28 23:33, 8F

05/28 23:34, 5年前 , 9F
然後回圈讀取後面長度 讀完再讀tail跟CRC
05/28 23:34, 9F

05/29 02:18, 5年前 , 10F
開心,原本還擔心不知道達人我在問什麼,看完回覆後有一
05/29 02:18, 10F

05/29 02:18, 5年前 , 11F
些可以嘗試的想法了,以protocol來處理也可以,只是蠻確
05/29 02:18, 11F

05/29 02:18, 5年前 , 12F
定以前處理C#時的ByteToRead在溝通介面上就已經預知stdi
05/29 02:18, 12F

05/29 02:18, 5年前 , 13F
n buffer可以讀進的資料長度
05/29 02:18, 13F

05/29 11:55, 5年前 , 14F
因為那不是預知啊...那是已經放在緩衝區的資料
05/29 11:55, 14F

06/03 11:20, 5年前 , 15F
補上意外發現的處理方式但未經驗證SetCommMask
06/03 11:20, 15F

06/03 11:21, 5年前 , 16F
跟WaitCommEvent
06/03 11:21, 16F

06/03 11:24, 5年前 , 17F
有興趣的參考如右邊連結 https://reurl.cc/L3DxkX
06/03 11:24, 17F
文章代碼(AID): #1UpvkuQv (C_and_CPP)
文章代碼(AID): #1UpvkuQv (C_and_CPP)