1、前言
在进行串口通信时,驱动器
或者单片机
往往只能发送或接收16进制
数据,而对于用户而言,16进制
数据显然晦涩难懂,需要将其转换为通俗易懂的10进制
或者可读字符串。QT中因为有相关的函数进行转换,特此总结,以加深印象。
说明:
系统:Windows10 X86
QT版本:6.1.2
驱动板通讯协议:Modbus协议
使用库:<QtSerialPort/QSerialPort>、<QtSerialPort/QSerialPortInfo>
2、串口参数配置
port_num = cui->cbx_port_num->currentText(); // 串口号
Baud=cui->cbx_ubaud->currentText(); // 波特率
Data_bits=cui->cbx_databits->currentText(); // 数据位
DCB = cui->cbx_stopbits->currentIndex(); // 停止位和校验位的index
// 设置参口参数
QSerialPort global_port; // 使用串口类声明串口对象
global_port.setPortName(port_num); // 设置串口号
global_port.setBaudRate(Baud.toInt(), QSerialPort::AllDirections); // 设置波特率
global_port.setFlowControl(QSerialPort::NoFlowControl);
switch (Databits.toInt()) { //设置数据位
case 5:
global_port.setDataBits(QSerialPort::Data5);
break;
case 6:
global_port.setDataBits(QSerialPort::Data6);
break;
case 7:
global_port.setDataBits(QSerialPort::Data7);
break;
case 8:
global_port.setDataBits(QSerialPort::Data8);
break;
default:
global_port.setDataBits(QSerialPort::Data8);
break;
}
// {{'n', '2'}, {'o', '1'}, {'e', '1'}, {'n', '1'}};
switch (DCB) { // 设置停止位 和 检验位
case 0:
global_port.setParity(QSerialPort::NoParity);
global_port.setStopBits(QSerialPort::TwoStop);
break;
case 1:
global_port.setParity(QSerialPort::OddParity);
global_port.setStopBits(QSerialPort::OneStop);
break;
case 2:
global_port.setParity(QSerialPort::EvenParity);
global_port.setStopBits(QSerialPort::OneStop);
break;
case 3:
global_port.setParity(QSerialPort::NoParity);
global_port.setStopBits(QSerialPort::OneStop);
break;
default:
global_port.setParity(QSerialPort::EvenParity);
global_port.setStopBits(QSerialPort::OneStop);
break;
}
global_port.open(QSerialPort::ReadWrite) // 以读写的方式打开串口
// global_port.isopen() 判断端口是否打开
// global_port.close() 关闭串口
3、驱动板接收数据
// 设置好串口参数后,才能进行此操作
// 从ui界面获取数据
QString data =ui->qlineedit->text();
// 判断数据中是否有空格,有空格去掉
if (data.contains(" "))
data.replace(QString(" "), QString(""));
// 数据转换
QByteArray buf = QByteArray::fromHex(data.toLatin1());
// 添加crc16位校验码
BYTE *data_crc;
data_crc = reinterpret_cast<unsigned char*>(buf.data()); //将qbytearray数据转成byte类型数据
res = CalcCrc16(data_crc, buf.size());
// 写入数据
global_port.write(buf, buf.size());
global_port.flush();
4、接收数据
QString data;
// 如果缓冲区有数据,继续读取,没有数据时执行下部操作
while (global_port.waitForReadyRead(100))
buffer.append(global_port.readAll().toHex().toUpper());
// 处理数据 错误返回数据和正常返回数据都>=5
if (buffer.size()>=5){
cui->textBrowser->clear();
data = buffer;
for (int i=0;i<data.size();i+=2+1)
data.insert(i, QLatin1String(" "));
data.remove(0,1);
// qDebug() <<"处理后的数据:"<<data;
cui->textBrowser->append(data);
}
buffer.clear() // 清除缓冲区
最后串口测试效果图: