QSerialPort 单独读取十六进制值
QSerialPort reads hex values sepereatly
我正在使用Qt的QSerialPort库与RS232通信。我将 ReadyRead 信号连接到我的 readData() 插槽;
connect(comms,SIGNAL(readyRead()),this,SLOT(readData()));
当我发送类似"Hello World!我可以使用comms.readAll()读取所有数据,comms.bytesAvailable()返回12。
但是当我发送"Hello World!\r"时,它分别显示"Hello World!"和"\r"部分,comms.bytesAvailable()首先返回12,然后返回2。
当我发送十六进制字节时,情况变得更糟(没有空格)
0x0F 0x00 0x43 0x11 0x00 0x04 0x11 0x00 0x02 0x70
它正确读取值,但一次读取 1 或 2 个字节。我尝试了等待读取(),但这没有帮助。
如何一次读取所有传入字节,即使它不是标准字母?
尝试在字节可用时从端口读取:
if (f_port->bytesAvailable()) { // If there are bytes available
QByteArray f_data; // data container
f_data.clear();
if (f_port->open(QIODevice::ReadWrite)) { // Try to open the port
while(f_port->bytesAvailable()) { // Reading loop
f_data.append(f_port->readAll());
}
f_port->flush();
f_port->close();
}
qDebug() << f_data; // Check the result
}
不幸的是,
您无法确定已读取所有数据。
您必须在某个中间缓冲区中收集传入数据,并分析它以查找符合协议定义的命令。也就是说,必须满足某些要求,例如固定长度或特定的起始字节(例如0x02)或结束字节(想到\r)或这些要求的组合。
一种方法是用您获得的字节累积缓冲区。然后验证它是否是正确的命令(这取决于您决定什么是正确的)并触发您想要执行的命令。此外,您还应该有一个计时器来从缓冲区中删除垃圾。
让我们用一个小的伪代码看看
static QByteArrray s_vBuffer;
readData()
{
s_vBuffer.append(....);
bool bValidCommand=VerifyCommand(s_vBuffer);
if(bValidCommand)
{
QByteArray vCommand=ExtractCommand(s_vBuffer);//also removing the part of the command
ExecuteCommand(vCommand);
}
else
{
//if timeout clear s_vBuffer
}
}
其他技术涉及命令末尾的校验和,CRC等
相关文章:
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- 在 c++ 中从文本文件中读取两个十六进制值
- 正在读取十六进制文件C++
- 写入和读取十六进制 TRAM QT 串行端口
- 从串行端口(POSIX)读取十六进制值
- 如何在C 中的Little Endian中读取来自二进制文件的单独的十六进制字符
- C++如何从文件中读取十六进制字节并将其存储为指针
- char* 如何读取十六进制的这个整数?它在 ostream::write() 中是如何工作的
- C++/CPP 读取添加的十六进制地址
- 为什么将uint8_t读取为十六进制没有按预期工作?
- 在十六进制中读取的数字在C 中给出了错误的数字
- 如何从字符中读取ASCII值并将其转换为十六进制格式的字符串
- 从 bin 文件 -c++ 中读取十六进制数字为每个字符 2 位数字
- 在十六进制编辑器中写入程序内存,并以编程方式读取
- 从 C++ 中的 txt 文件中读取十六进制
- 从文件中读取 4 个十六进制值并转换为浮点数
- 从ini文件中读取十六进制字符
- 从二进制文件读取/写入十六进制字节
- 在C++中以十六进制读取文件
- 以十六进制读取/写入二进制对象