Я использую QtSerialPort для отправки последовательных сообщений через COM-порт на модем INSTEON PowerLinc 2413U. Я умею жестко кодировать и отправлять сообщения, но мне нужно отправить одно и то же сообщение, используя переменные идентификаторы устройств. Ниже приведена структура, которую я использовал для отправки статических сообщений:
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 представляют идентификатор устройства. «1BE94B» в этом случае. Моя функция принимает идентификатор устройства, для которого должно быть выполнено действие через QString.
Как я могу преобразовать 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 основывается на юникоде / шортах, а не на символах. Для меня это работает, когда я использую 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;
Если ваш идентификатор является текстовым, а не байтовым, то необходимо добавить fromHex:
QString devId( "1BE94B" );
msg.replace( 2, 3, QByteArray::fromHex( devId.toLocal8Bit() ) );
Других решений пока нет …