作者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/cn.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