1

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 を受け入れます。

必要な 3 つのインデックスの構造に合わせて QString を変換するにはどうすればよいですか。次を使用して、3バイトアドレスの各バイトを正常に取得します。

devID.mid(0,2)
devID.mid(2,2)
devID.mid(4,2)

私の Target 実装は、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()です。

ご提案ありがとうございます。

4

1 に答える 1

1

ここでの問題の一部は、QString が Unicode/short ベースであり、char ベースではないことです。私にとっては、使用すると機能します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() ) );
于 2013-02-18T13:17:06.887 に答える