QT做一个串口通信工具
原文链接:https://blog.csdn.net/hwc3737/article/details/108365795
添加依赖:
①在项目的.pro文件中添加:
QT += serialport
②引入相关头文件
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
实现步骤:
①要进行串口通信,第一步一定是搜索可用串口咯,可参考下列实例,搜索当前可用串口并将其输出到一个QComboBox上。
void Widget::on_btn_work_renew_sperial_clicked()
{
ui->cbox_sperial->clear(); //每次搜索前必将ComboBox清除,否则会导致叠加。
//遍历找到所有可用串口
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
QSerialPort findSerial;
findSerial.setPort(info);
if(findSerial.open(QIODevice::ReadWrite))
{
ui->cbox_sperial->addItem(findSerial.portName()); //每找到一个便添加至ComboBox
findSerial.close();
}
}
//最后通过判断ComboBox的项数,若为0则提示未找到串口
if(ui->cbox_sperial->count() == 0) {
QMessageBox::information(this, "提示", "未找到可用串口", "确定");
}
}
②定义一个串口对象,作为主窗口的私有成员对象
QSerialPort *serialport;
③开启串口实现函数
void Widget::openSperial()
{
//判断ComboBox是否未选中任何项,即没有可用串口,则进行提示并跳出函数
if(ui->cbox_sperial->currentText().isEmpty()){
QMessageBox::warning(this, "提示", "未选中任何可用串口", "确定");
return;
}
//新建对象
this->serialport = new QSerialPort;
//设置串口名
serialport->setPortName(ui->cbox_sperial->currentText()); //获取界面ComboBox选中的值
//打开串口读写功能
serialport->open(QIODevice::ReadWrite);
//设置波特率
serialport->setBaudRate(9600);
//设置数据位
serialport->setDataBits(QSerialPort::Data8); //其他可选值有QSerialPort::Data7、QSerialPort::Data6、QSerialPort::Data5
//设置校验位
serialport->setParity(QSerialPort::NoParity); //即无校验,其他可选值有QSerialPort::OddParity(奇校验)、QSerialPort::EvenParity(偶校验)
//设置停止位
serialport->setStopBits(QSerialPort::OneStop); //1位停止位,其他可选值有QSerialPort::TwoStop(2位停止位)
//设置不启用流控制
serialport->setFlowControl(QSerialPort::NoFlowControl);
//绑定数据接收信号,每次接收到数据则触发Read_Data槽函数
QObject::connect(serialport, SIGNAL(readyRead()), this, SLOT(Read_Data()));
}
④发送数据
void Widget::on_btn_send_data_clicked()
{
//要发送的数据
QString data = "hello";
QByteArray buf;
bool ok;
char send16 = data.toInt(&ok,16)&0xFF; //将数据转换成16进制
if(ok){//转换成功
//发送过程中禁用关闭串口按钮,保证数据发送时串口不会被意外中断
ui->btn_sperial_out->setEnabled(false);
buf = &send16;
buf.append("\r\n");
serialport->write(buf);
//重新启用关闭按钮
ui->btn_sperial_out->setEnabled(true);
}else {
QMessageBox::critical(this, "提示", "数据转换失败", "确定");
}
}
⑤接收数据
void Widget::Read_Data()
{
QByteArray buf;
buf = serialport->readAll();
qDebug()<<buf;
}
本文为作者从实际项目中脱离出来的总结,仅供参考,亲测可稳定运行。
若有发现问题,欢迎留言补充。
转载请注明出处。