[问题] 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