之前一章学习的是第三方库使用: 34.QT-qextserialport第三方库制作串口助手(并动态检测在线串口,附带源码)

本章来学习自带serial库

1.QSerialPortInfo

QList<QSerialPortInfo>  QSerialPortInfo::availablePorts();
//获取当前在线的串口设备

示例如下:

foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{ qDebug() << "Name : " << info.portName(); qDebug() << "Description : " << info.description(); qDebug() << "Manufacturer: " << info.manufacturer(); qDebug() << "Serial Number: " << info.serialNumber(); qDebug() << "System Location: " << info.systemLocation();
}

2.QSerialPort初始化

初始化如下所示:

serialport.setPortName(cfg.portName);
serialport.setBaudRate(QSerialPort::Baud115200);
serialport.setParity(QSerialPort::NoParity);
serialport.setDataBits(QSerialPort::Data8);
serialport.setStopBits(QSerialPort::OneStop);
serialport.setFlowControl(QSerialPort::NoFlowControl);
if(!serialport.open(QIODevice::ReadWrite))
{
qDebug()<<"打开失败";
return;
}

3.QSerialPort信号介绍

void readyRead();
//当串口接收到下位机发送数据时,将会发送该信号,然后我们在对应的槽函数调用serialport .readAll()即可 error(QSerialPort::SerialPortError );
//串口错误信号,比如当串口打开失败,串口连接时突然断开,都将会调用该信号
//比如: QSerialPort::PermissionError (表示串口连接断开了)

4.QSerialPort示例

Widget::Widget(QWidget *parent)
: QWidget(parent),
serialport(this),
btn("发送",this)
{
serialport.setPortName("COM21");
serialport.setBaudRate(QSerialPort::Baud115200);
serialport.setParity(QSerialPort::NoParity);
serialport.setDataBits(QSerialPort::Data8);
serialport.setStopBits(QSerialPort::OneStop);
serialport.setFlowControl(QSerialPort::NoFlowControl);
if(!serialport.open(QIODevice::ReadWrite))
{
qDebug()<<"打开失败";
return;
}
connect(&serialport,SIGNAL(readyRead()),this,SLOT(onReadyRead()));
connect(&btn,SIGNAL(clicked()),this,SLOT(sendSerialData()));
} void Widget::onReadyRead()
{
QString str(serialport.readAll());
qDebug()<<str;
}
void Widget::sendSerialData()
{
serialport.write(QString("发送:%1\r\n").arg(qrand()).toLocal8Bit()); //发送随机值
}

运行打印:

发现下位机发送上来的是乱码的,这是因为我们下位机程序是用的gbk编码写的,所以打印汉字乱码了

5.修改代码-添加数据格式编码转换

修改发送/接收函数:

void Widget::onReadyRead()
{
QString str(fromGBKtoUtf8(serialport.readAll()));
QStringList list = str.split(QRegExp("[\r\n]"), QString::SkipEmptyParts); //去掉\r\n , SkipEmptyParts表示如果末尾为\r\n则不需要打印 foreach (QString line, list) {
qDebug()<<line;
}
} void Widget::sendSerialData()
{
//serialport.write(QString("%1\r\n").arg(qrand()).toLocal8Bit());
serialport.write(fromUtf8toGBK(QString("%1\r\n").arg(qrand())));
} QString Widget::fromGBKtoUtf8(QByteArray arry)
{
QTextCodec *gbk = QTextCodec::codecForName("gbk");
QTextCodec *utf8 = QTextCodec::codecForName("UTF-8"); QString unicode=gbk->toUnicode(arry);
return QString(utf8->fromUnicode(unicode));
} QByteArray Widget::fromUtf8toGBK(QString str)
{
QTextCodec *gbk = QTextCodec::codecForName("gbk");
QTextCodec *utf8 = QTextCodec::codecForName("UTF-8");
QString unicode=utf8->toUnicode(str.toLocal8Bit());
return gbk->fromUnicode(unicode);
}

运行打印:

6.在QThread线程中使用QSerialPort

由于在QThread线程里不能用槽函数,不过可以在run里使用QSerialPort::waitForReadyRead()来阻塞获取读数据.如果在指定时间内读取成功/失败,则向界面发送数据.

示例如下:

       serialport.write( QString("%1\r\n").arg(qrand()).toLocal8Bit() );    //写入随机值
if(serialport.waitForBytesWritten()) //100ms 等待写入成功
{
if(serialport.waitForReadyRead()) //等待数据返回
{
QString str((serialport.readAll()));
QStringList list = str.split(QRegExp("[\r\n]"),QString::SkipEmptyParts); //去掉\r\n foreach (QString line, list) { qDebug()<<line; //解析line,并向界面发送信号 ... ...
}
}
else
qDebug()<<"read err";
}
else
qDebug()<<"write err";

最新文章

  1. CSS教程:div垂直居中的N种方法[转]
  2. HDU-2296 Ring(AC自动机+DP)
  3. Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..
  4. 长文件名导致的0x80070057
  5. UIStepper
  6. UVa 1401 (Tire树) Remember the Word
  7. maven项目构建
  8. c++中string的用法
  9. thinkphp获取特定字段的两种方法
  10. 大道至简第一章观后感——java伪代码
  11. Android时遇到R.java was modified manually! Reverting to generated version!
  12. LeetCode(47)-Reverse Bits
  13. Asp.Net Core Options模式的知识总结
  14. opencv学习之路(29)、轮廓查找与绘制(八)——轮廓特征属性及应用
  15. JavaScript中,JSON格式的字符串与JSON格式的对象相互转化
  16. C++ Primer 笔记——OOP
  17. 树剖+线段树||树链剖分||BZOJ1984||Luogu4315||月下“毛景树”
  18. 考勤管理系统V1.0.3
  19. Delphi编写Shell扩展
  20. [Java学习]面向对象-多态

热门文章

  1. MySQL必知必会(Insert into)
  2. luogu P3110 [USACO14DEC]驮运Piggy Back |最短路
  3. luogu P1850 换教室
  4. 定时器注解 @Scheduled 使用
  5. unrecognized selector sent to class 0x10a4ce490 我躺过的坑
  6. python 金融应用(三)数据可视化
  7. Linux IO多路复用之epoll网络编程
  8. 【JS】297-[译]正确使用 sort() 方法
  9. 《JavaScript 模式》知识点小抄本(上)
  10. Orleans 初接触(一) 入门例子