2013-02-18 39 views
1

我使用QtSerialPort跨COM端口串行消息發送到一個INSTEON PowerLinc 2413U調制解調器。我可以硬編碼併發送消息,但是我需要使用可變設備ID發送相同的消息。以下是我用來發送靜態消息的結構:Qt的 - 轉換的QString到的QByteArray的指數 - 劃分裝置ID爲3個指數

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 

我已經成功地看到所使用的設備操作的唯一方法是通過使用msg.append()似乎並沒有單獨工作分配在QByteArray中的每個字節。

謝謝您的建議!這裏的問題的

+1

也許你可以用'的QByteArray :: fromHex(常量的QByteArray& ')附加值 – Zaiborg 2013-02-18 07:16:03

+0

我相信如果有的話,它會是'msg = STRINGOFCOMMANDS.toHex()',但是我嘗試了一些非常相似的東西,但它不起作用。我需要將我的三字節設備地址轉換爲三個單獨的索引,其數據類型與上面的「msg [x] ='結構對齊。 或者,如果有更好的實施,我很樂意聽到! – 2013-02-18 13:17:13

回答

1

部分是QString的是unicode /短基礎,而不是基於焦炭。對我來說,它的工作原理,當我使用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())); 
+0

托馬斯,非常感謝你的回覆。我仍然不確定這將如何適用於我所需要的。我修改了我的帖子以反映我的預期目標實施情況。我的問題是我的設備ID源自傳遞給函數的字符串,而不是像上面顯示的那樣被硬編碼爲索引。 – 2013-02-18 13:27:37

+0

我修改了我的示例以匹配修改後的問題。 – Thomas 2013-02-18 13:47:03

+0

我添加了一個額外的例子,當id是從而不是字節的文本。 – Thomas 2013-02-18 14:23:20