前面写过一篇用qt做串口助手的博文
(基于Qt5.6做一个最简单的具有收发功能的串口助手 )
,做出来的串口助手只能进行字符的收发,如果接收的是十六进制的数据的话,就会显示乱码,现在在它的基础上做一些修改,从而实现十六进制收发。
首先我在网上找到了两个函数,然后对收发函数进行简单的修改,对收到的内容的排版进行一些控制。下面贴出两个函数。
void Widget::StringToHex(QString str, QByteArray &senddata) //字符串转换为十六进制数据0-F
{
int hexdata,lowhexdata;
int hexdatalen = 0;
int len = str.length();
senddata.resize(len/2);
char lstr,hstr;
for(int i=0; i<len; )
{
//char lstr,
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);
}
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;//不在0-f范围内的会发送成0
}
把这两个函数添加到源文件里就可以使用了。
记得这是函数的定义部分,还要在头文件那里private slots对函数进行声明。
然后再修改下收发的两个函数:
发的
void Widget::on_pushButton_send_clicked()
{
QString str = ui->lineEdit_write->text();//从LineEdit得到字符串
int len = str.length();
if(len%2 == 1) //如果发送的数据个数为奇数的,则在前面最后落单的字符前添加一个字符0
{
str = str.insert(len-1,'0'); //insert(int position, const QString & str)
}
QByteArray senddata;
StringToHex(str,senddata);//将str字符串转换为16进制的形式
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);
}
}
改完后的效果是这样的
版权声明:本文为imkelt原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。