看板 C_and_CPP 關於我們 聯絡資訊
直接切入正題 訪問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
SeamusBerloz: lpNumberOfBytesRead 不就是回傳長度嗎? 05/28 19:51
SeamusBerloz: nNumberOfBytesToRead 應該是指最多不要超過此長度 05/28 19:52
SeamusBerloz: 吧。 05/28 19:52
annheilong: 一種做法是跟他說buffer大小,然後看實際讀多少回來 05/28 23:30
annheilong: 通常protocol讀完head後面 會再讀取後續資料長度 05/28 23:31
annheilong: 例如讀完0x02 head後,再讀2 bytes知道剩下多長(不含 05/28 23:32
annheilong: tail跟CRC 05/28 23:32
annheilong: 所以讀到1 byte 0x02後,再讀2 bytes知道後面長度 05/28 23:33
annheilong: 然後回圈讀取後面長度 讀完再讀tail跟CRC 05/28 23:34
getaway: 開心,原本還擔心不知道達人我在問什麼,看完回覆後有一 05/29 02:18
getaway: 些可以嘗試的想法了,以protocol來處理也可以,只是蠻確 05/29 02:18
getaway: 定以前處理C#時的ByteToRead在溝通介面上就已經預知stdi 05/29 02:18
getaway: n buffer可以讀進的資料長度 05/29 02:18
kobe8112: 因為那不是預知啊...那是已經放在緩衝區的資料 05/29 11:55
getaway: 補上意外發現的處理方式但未經驗證SetCommMask 06/03 11:20
getaway: 跟WaitCommEvent 06/03 11:21
getaway: 有興趣的參考如右邊連結 https://reurl.cc/L3DxkX 06/03 11:24