用QT实现简单的串口通信
大家好,这是我人生中的第一篇博客,之所以想开始写博客的原因是因为本人刚毕业进行工作,在工作中常常会遇到很多困难,就常常跑来看大佬们的博客,对我的帮助特别大,所以自己也想把自己的学习经验记录下来,方便以后查看,其实也是想把自己遇到的困难以及如何解决的分享给大家,让大家给我这个小白提提意见。
创建一个QT Widgets Application
这一步就不用过多的叙述了,就是简单的创建一个项目。
设计串口助手界面
在新项目中,Forms文件夹下有一个ui文件,双击便可以进行界面设计。
这是一个比较简单的界面,主要用了Combox、Check Box、Push Button、Label。
这里建议大家将控件的objectName根据实际含义进行设置,方便后面写代码的时候进行功能识别。如果是按照默认的1.2.3.4排序十分让人头疼。还会迫害以后读你代码的人。
代码
项目中我们需要QT自带的QSerialPort、QSerialPortInfo两个类
//在.pro文件里加入
QT += core gui serialport
// 首先我们需要用foreach 获取电脑可用端口信息
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
Serial.setPort(info); //将获得的端口赋予我们的对象
if(Serial.open(QIODevice::ReadWrite))//打开串口
ui->cmb_port->addItem(Serial.portName());//将获得的串口名称赋予我们的Combox
Serial.close();
}
// 打开串口、设置波特率、停止位、校验位(打开串口按钮的槽函数中完成)
QString Com_Name = ui->cmb_port->currentText();//获取Combox当前Text,就是串口名COM1等。
Serial.setPortName(Com_Name);
if(!Serial.open(QIODevice::ReadWrite)){
QMessageBox::warning(this,"error","SP not open");
}
//设置波特率
int Baud = ui->cmb_baud->currentText().toInt();
switch (Baud)
{
case 9600:
Serial.setBaudRate(QSerialPort::Baud9600);
break;
case 19200:
Serial.setBaudRate(QSerialPort::Baud19200);
break;
case 115200:
Serial.setBaudRate(QSerialPort::Baud115200);
}
//设置停止位(setStopBits)、校验位(setParity)与设置波特率类似、具体参数详看帮助文档,不过Switch的条件最好用Combox的currentIndex来获取。
//打开串口后我们需要进行给接收区域发送一个信号
connect(&Serial,&QSerialPort::readyRead,this,&SerialPort::receive_port);
ui->btn_open->setEnabled(false);//打开串口按钮置灰
ui->btn_close->setEnabled(true);//关闭串口按钮置亮
// 发送信息
QString send_info = ui->textEdit_send->toPlainText();//获取发送框中的数据
if (ui->ckb_send->checkState() == Qt::Checked)//是否勾选转换16进制
{
Serial.write(send_info.toUtf8().toHex());
qDebug()<<send_info;
}else
Serial.write(send_info.toUtf8());
// 接收数据
QByteArray receive_info = Serial.readAll();//获取串口读取的数据
qDebug()<<receive_info;
if (ui->ckb_receive->checkState() == Qt::Checked)//是否勾选转换16进制
ui->textEdit_receive->insertPlainText(receive_info.toHex(' ').toUpper().append(" "));
else
ui->textEdit_receive->insertPlainText(receive_info);
// 关闭串口
Serial.clear();//清除串口
Serial.close();//关闭串口
disconnect(&Serial,&QSerialPort::readyRead,this,&SerialPort::receive_port);//这里需要注意将之前打开串口发送的信号断掉。
ui->btn_open->setEnabled(true);
ui->btn_close->setEnabled(false);
写到这里串口简单的收发功能就实现了。下面展示一下结果图。
发送数据hello world。
接收16进制数据
这篇文章就算结束了,给自己一个提醒也顺便提醒一下大家,帮助文档真的很重要,一定要学会如何查看,一定要学会!!!希望自己的皮毛能帮助到需要的人。谢谢大家的查看。