我正在使用 QtSerialPort 通过 COM 端口将串行消息发送到 INSTEON PowerLinc 2413U 调制解调器。我可以很好地硬编码和发送消息,但是我需要使用可变设备 ID 发送相同的消息。以下是我用来发送静态消息的结构:
QByteArray msg;
bool msgStatus;
msg.resize(8);
msg[0] = 0x02;
msg[1] = 0x62;
msg[2] = 0x1B;
msg[3] = 0xE9;
msg[4] = 0x4B;
msg[5] = 0x11;
msg[6] = 0x05;
msg[7] = 0x00;
send(msg,&msgStatus);
索引位置 2、3 和 4 代表设备 ID。本例中为“1BE94B”。我的函数接受应该通过 QString 执行操作的设备 ID。
如何转换 QString 以适应所需的 3 个索引结构。我使用以下方法成功获取了 3 字节地址的每个字节:
devID.mid(0,2)
devID.mid(2,2)
devID.mid(4,2)
我的目标实现是让 QByteArray 看起来像这样:
QByteArray msg;
bool msgStatus;
msg.resize(8);
msg[0] = 0x02;
msg[1] = 0x62;
msg[2] = devID.mid(0,2)
msg[3] = devID.mid(2,2)
msg[4] = devID.mid(4,2)
msg[5] = 0x11;
msg[6] = 0x05;
msg[7] = 0x00;
send(msg,&msgStatus);
我尝试了很多不同的转换方案,但一直无法解决我需要的问题。最终我的 msg
应该被构造为:
02621DE94B151300
我成功看到预期的设备操作的唯一方法是单独分配 QByteArray 中的每个字节,使用 msg.append()
似乎不起作用。
感谢您的建议!
最佳答案
这里的部分问题是 QString 是基于 unicode/short 而不是基于字符的。对我来说,它在我使用 toLocal8Bit
QByteArray id;
idd.resize(3);
id[0] = 0x1B;
id[1] = 0xE9;
id[2] = 0x4B;
QString devId( bytes );
QByteArray msg;
msg.resize(8);
msg[0] = 0x02;
msg[1] = 0x62;
msg.replace( 2, 3, devId.toLocal8Bit() );
msg[5] = 0x11;
msg[6] = 0x05;
msg[7] = 0x00;
如果您的 id 是文本,而不是字节,则必须添加 fromHex:
QString devId( "1BE94B" );
msg.replace( 2, 3, QByteArray::fromHex( devId.toLocal8Bit() ) );
关于c++ - Qt - 将 QString 转换为 QByteArray 的索引 - 将设备 ID 分成 3 个索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14929769/