根据您提供的代码片段以及Modbus RTU通讯协议,假设数据帧 “01 10 00 00 00 02 04 00 01 00 00 a2 6f” 表示向从机(slave)写入两个16位寄存器的命令,并且包含温度值。以下是一个修改后的示例代码,用于解析接收到的数据帧并处理其中的寄存器值:
void readData()
{
buffer.append(serial.readAll());
// 查找帧头索引
int startIdx = buffer.indexOf(0x01);
// 如果没有找到帧头,清空缓存
if (startIdx == -1) {
buffer.clear();
return;
}
// 截取有效数据
buffer = buffer.mid(startIdx);
while (buffer.size() >= 13) { // 数据帧长度为13字节
quint16 temperature = static_cast<quint8>(buffer.at(10)) | (static_cast<quint8>(buffer.at(11)) << 8);
qDebug() << "Temperature:" << temperature;
QByteArray response;
response.append(buffer.mid(0, 4)); // 提取设备地址、功能码和起始地址等信息
response.append(buffer.mid(4, 6)); // 将保持寄存器地址和寄存器数量原样放入响应
response.append(static_cast<char>(temperature & 0xFF));
response.append(static_cast<char>((temperature >> 8) & 0xFF));
sendResponse(response);
// 移除已处理的数据
buffer.remove(0, 13); // 每次处理一条完整数据帧,长度为13字节
}
}
这段代码会不断读取串口接收到的数据,查找Modbus RTU通讯协议中指定格式的数据帧,并解析其中温度值。然后将响应帧发送出去。您可以根据需要对代码进行进一步调整和优化。
内容由零声教学AI助手提供,问题来源于学员提问