前面写过一篇用qt做串口助手的博文(基于Qt5.6做一个最简单的具有收发功能的串口助手 ),做出来的串口助手只能进行字符的收发,如果接收的是十六进制的数据的话,就会显示乱码,现在在它的基础上做一些修改,从而实现十六进制收发。
首先我在网上找到了两个函数,然后对收发函数进行简单的修改,对收到的内容的排版进行一些控制。下面贴出两个函数。
void Widget::StringToHex(QString str, QByteArray &senddata)
{
int hexdata,lowhexdata;
int hexdatalen = 0;
int len = str.length();
senddata.resize(len/2);
char lstr,hstr;
for(int i=0; i<len; )
{
hstr=str[i].toLatin1();
if(hstr == ' ')
{
i++;
continue;
}
i++;
if(i >= len)
break;
lstr = str[i].toLatin1();
hexdata = ConvertHexChar(hstr);
lowhexdata = ConvertHexChar(lstr);
if((hexdata == 16) || (lowhexdata == 16))
break;
else
hexdata = hexdata*16+lowhexdata;
i++;
senddata[hexdatalen] = (char)hexdata;
hexdatalen++;
}
senddata.resize(hexdatalen);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
char Widget::ConvertHexChar(char ch)
{
if((ch >= '0') && (ch <= '9'))
return ch-0x30;
else if((ch >= 'A') && (ch <= 'F'))
return ch-'A'+10;
else if((ch >= 'a') && (ch <= 'f'))
return ch-'a'+10;
else return ch-ch;
}
把这两个函数添加到源文件里就可以使用了。
记得这是函数的定义部分,还要在头文件那里private slots对函数进行声明。
![函数声明](https://img-blog.csdn.net/20160716103757397)
然后再修改下收发的两个函数:
发的
void Widget::on_pushButton_send_clicked()
{
QString str = ui->lineEdit_write->text();
int len = str.length();
if(len%2 == 1)
{
str = str.insert(len-1,'0');
}
QByteArray senddata;
StringToHex(str,senddata);
my_serialPort->write(senddata);
}
收的
void Widget::readMyCom()
{
QByteArray temp = my_serialPort->readAll();
QDataStream out(&temp,QIODevice::ReadWrite);
while(!out.atEnd())
{
qint8 outChar = 0;
out>>outChar;
QString str = QString("%1").arg(outChar&0xFF,2,16,QLatin1Char('0'));
ui->textBrowser->insertPlainText(str.toUpper());
ui->textBrowser->insertPlainText(" ");
ui->textBrowser->moveCursor(QTextCursor::End);
}
}
改完后的效果是这样的
![这里写图片描述](https://img-blog.csdn.net/20160716104606910)