鄙人在学习QT软件编写上位机的过程中,电表的地址为6个16进制的字节,需要用上位机进行操作更改。
16进制转 字符串的代码如下:
QString str;
for(int i =0;i<6;i++)
{
str += QString("%1").arg(stru.protocol.dlt645.addr[i], 2, 16, QChar('0'));
}
其中,addr[i] 为从下位机读到的地址,2代表宽度,16代表16进制数据,
QString QString::arg(inta,intfieldWidth = 0,intbase = 10,QCharfillChar = QLatin1Char( ' ' )) const
If fillChar is '0' (the number 0, ASCII 48), the locale's zero is used. For negative numbers, zero padding might appear before the minus sign.
字符串转16进制如下:
因为上位机输入的是地址连续的字符串,没有任何断点(split)不能用,只能用mid 来实现,获得每两个字节,然后再转到16进制数据通过串口输出。 mid的字节从0开始数(代表1)。
QString str = ui->tableWidget->item(iRow,4)->text();
QString addr0,addr1,addr2,addr3,addr4,addr5;
addr0 = str.mid(0,2);
addr1 = str.mid(2,2);
addr2 = str.mid(4,2);
addr3 = str.mid(6,2);
addr4 = str.mid(8,2);
addr5 = str.mid(10,2);
stru.protocol.dlt645.addr[0]=addr0.toInt(0,16);
stru.protocol.dlt645.addr[1]=addr1.toInt(0,16);
stru.protocol.dlt645.addr[2]=addr2.toInt(0,16);
stru.protocol.dlt645.addr[3]=addr3.toInt(0,16);
stru.protocol.dlt645.addr[4]=addr4.toInt(0,16);
stru.protocol.dlt645.addr[5]=addr5.toInt(0,16);
为保证每次更改地址时,每次输入的地址必须为12位,做了一个比较Low警告处理,如下:
if(str.size() == 12)
{
QString addr0,addr1,addr2,addr3,addr4,addr5;
addr0 = str.mid(0,2);
addr1 = str.mid(2,2);
addr2 = str.mid(4,2);
addr3 = str.mid(6,2);
addr4 = str.mid(8,2);
addr5 = str.mid(10,2);
stru.protocol.dlt645.addr[0]=addr0.toInt(0,16);
stru.protocol.dlt645.addr[1]=addr1.toInt(0,16);
stru.protocol.dlt645.addr[2]=addr2.toInt(0,16);
stru.protocol.dlt645.addr[3]=addr3.toInt(0,16);
stru.protocol.dlt645.addr[4]=addr4.toInt(0,16);
stru.protocol.dlt645.addr[5]=addr5.toInt(0,16);
}
else
{
QMessageBox::warning(this,tr("警告"),tr("电表的地址为12位!请正确输入"));
return;
}
这样只要输入的超过12位或不足12位,都需要重新设置地址。