gpt4 book ai didi

C++ - 确保完整的串行响应

转载 作者:太空宇宙 更新时间:2023-11-04 04:04:35 24 4
gpt4 key购买 nike

我正在尝试从硬件设备读取串行响应。我读取的字符串很长,我只需要其中的一部分。要获取我想要的字符串部分,我使用 std::string.substr(x,y); 。然而,我遇到的问题是有时会出现异常错误,因为我正在读取的缓冲区没有 y 字符。这是我现在用来读取值的代码:

while(1)
{
char szBuff[50+1] = {0};
char wzBuff[14] = {"AT+CSQ\r"};

DWORD dZBytesRead = 0;
DWORD dwBytesRead = 0;


if(!WriteFile(hSerial, wzBuff, 7, &dZBytesRead, NULL))
std::cout << "Write error";

if(!ReadFile(hSerial, szBuff, 50, &dwBytesRead, NULL))
std::cout << "Read Error";



std:: cout << szBuff;
std::string test = std::string(szBuff).substr(8,10);
std::cout << test;
Sleep(500);

我正在发出命令“AT+CSQ”。这将返回:

N, N

OK

它返回两个由逗号分隔的整数值,后跟一个新行,然后是“OK”。

我的问题是,如何确保在抓取子字符串之前从串行端口读取所有值?据我了解,收到的最后一个字符应该换行。

最佳答案

ReadFile 函数的接口(interface)似乎为您提供了读取的字节数。如果您知道预期的长度,您应该循环尝试从文件(可能是端口描述符)读取,直到读取预期的字节数。

如果不知道响应的长度,您可能必须读取并检查读取缓冲区是否已读取分隔符标记(在这种情况下,您的协议(protocol)似乎表明可以使用换行符确定 EOM -- 消息结束)

如果您可以使用其他库,我会考虑使用 boost::asioread_until 功能(或您正在使用的任何库中的等效功能)。虽然管理此问题的代码不是火箭科学,但在大多数情况下,重新发明轮子是没有意义的。

关于C++ - 确保完整的串行响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7712408/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com