QT串口收发
- 串口扫描
- 配置串口信息
- 设置串口名称
- 设置波特率
- 设置数据位
- 设置奇偶校验
- 设置停止位
- 设置流控制
- 设置读取数据的缓存大小
- 打开串口
- 串口打开并配置代码
- 串口接收数据
- 串口发送数据
- 串口关闭
- offAndOn自定义函数,使comboBox不可再选
- 源码:
串口扫描
将串口模块添加到工程中
在.pro文件中添加serialport
用到的头文件:
#include <QSerialPortInfo>
#include <QSerialPort>
QSerialPort类提供访问串口的功能,还可以通过QSerialPortInfo类获取可用串口的信息。
QSerialPortInfo类允许枚举系统中所有串口的信息,包括串口名称、系统位置、描述和制造商。
QSerialPortInfo::availablePorts();返回系统上可用串口的列表。
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
//这里只是临时读取可用串口不要在堆区直接开辟空间
QSerialPort port;
port.setPort(info);
//以可读可写的方式打开(临时打开,扫描可用串口)
if(port.open(QIODevice::ReadWrite))
{
//将扫描到的可用串口写入到comboBox里
ui->comboBox->addItem(port.portName());
//关闭串口
port.close();
}
}
foreach(variable, container)”可以看到,foreach有两个参数:
container:容器,即被遍历的对象
variable:当前元素,即遍历container过程中,当前的那个元素
声明QSerialPort成员变量
定义指针变量,用来承接在堆区开辟的对象,使之在全局范围内可用
在主窗口中实例化串口对象,和对可用串口进行扫描
配置串口信息
通过QSerialPort类型定义的串口对象 对串口参数设置
配置信息主要是在串口打开时设置的,所以我们可以设置在串口打开按钮槽函数里面
设置串口名称
void QSerialPort::setPortName(const QString &name)
//ui->comboBox->currentText()//是comboBox当前的文本内容
m_port->setPortName(ui->comboBox->currentText());
设置波特率
setBaudRate(qint32 baudRate, Directions directions = AllDirections)
baudRate:为int类型 的波特率
m_port->setBaudRate(ui->comboBox_2->currentText().toInt());
//ui->comboBox_2->currentText().toInt()//将comboBox_2当前文本内容转换为int
设置数据位
setDataBits(DataBits dataBits)
DataBits的类型为:
//comboBox_4数据位comboBox
//设置数据位
switch (ui->comboBox_4->currentText().toInt())
{
case 8:
m_port->setDataBits(QSerialPort::Data8);
break;
case 7:
m_port->setDataBits(QSerialPort::Data7);
break;
case 6:
m_port->setDataBits(QSerialPort::Data6);
break;
case 5:
m_port->setDataBits(QSerialPort::Data5);
break;
}
设置奇偶校验
在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。
bool setParity(Parity parity)
if(ui->comboBox_5->currentText() == tr("无"))
m_port->setParity(QSerialPort::NoParity);
else if(ui->comboBox_5->currentText() == tr("奇校验"))
m_port->setParity(QSerialPort::EvenParity);
else if(ui->comboBox_5->currentText() == tr("偶校验"))
m_port->setParity(QSerialPort::OddParity);
else if(ui->comboBox_5->currentText() == tr("空格"))
m_port->setParity(QSerialPort::SpaceParity);
else if(ui->comboBox_5->currentText() == tr("标记"))
m_port->setParity(QSerialPort::MarkParity);
设置停止位
bool setStopBits(StopBits stopBits)
if(ui->comboBox_3->currentText() == tr("1"))
m_port->setStopBits(QSerialPort::OneStop);
else if(ui->comboBox_3->currentText() == tr("1.5"))
m_port->setStopBits(QSerialPort::OneAndHalfStop);
else if(ui->comboBox_3->currentText() == tr("2"))
m_port->setStopBits(QSerialPort::TwoStop);
设置流控制
bool setFlowControl(FlowControl flowControl)
m_port->setFlowControl(QSerialPort::NoFlowControl); //设置为无流控制
设置读取数据的缓存大小
它的大小决定了串口收到数据后可以缓存的数据的大小,如果长时间不将数据从缓冲区取出来,会出现溢出丢数据的情况。所以这个缓存的大小可以根据实际的通信速度和数据量进行设置。
m_port->setReadBufferSize(40960);
打开串口
ReadWrite//可读可写
m_serialPort->open(QIODevice);
参数可以设置串口为只读、只写、读写三种方式。
串口打开并配置代码
这一过程我主要在串口打开按钮槽函数完成的
m_port->setBaudRate(ui->comboBox_2->currentText().toInt());//设置波特率
m_port->setPortName(ui->comboBox->currentText());
if(m_port->open(QIODevice::ReadWrite))
{
//设置数据位
switch (ui->comboBox_4->currentText().toInt())
{
case 8:
m_port->setDataBits(QSerialPort::Data8);
break;
case 7:
m_port->setDataBits(QSerialPort::Data7);
break;
case 6:
m_port->setDataBits(QSerialPort::Data6);
break;
case 5:
m_port->setDataBits(QSerialPort::Data5);
break;
}
//设置停止位
if(ui->comboBox_3->currentText() == tr("1"))
m_port->setStopBits(QSerialPort::OneStop);
else if(ui->comboBox_3->currentText() == tr("1.5"))
m_port->setStopBits(QSerialPort::OneAndHalfStop);
else if(ui->comboBox_3->currentText() == tr("2"))
m_port->setStopBits(QSerialPort::TwoStop);
//设置校验位
if(ui->comboBox_5->currentText() == tr("无"))
m_port->setParity(QSerialPort::NoParity);
else if(ui->comboBox_5->currentText() == tr("奇校验"))
m_port->setParity(QSerialPort::EvenParity);
else if(ui->comboBox_5->currentText() == tr("偶校验"))
m_port->setParity(QSerialPort::OddParity);
else if(ui->comboBox_5->currentText() == tr("空格"))
m_port->setParity(QSerialPort::SpaceParity);
else if(ui->comboBox_5->currentText() == tr("标记"))
m_port->setParity(QSerialPort::MarkParity);
offAndOn(false);
m_port->setFlowControl(QSerialPort::NoFlowControl); //设置为无流控制
m_port->setReadBufferSize(40960);
}
else {
qDebug() << "串口打开失败";
}
串口接收数据
串口接收数据 是通过信号readyRead信号,接收串口数据
信号:readyRead信号
//设置串口监听
connect(m_port,SIGNAL(readyRead()),this,SLOT(ReadData()));
//ReadData() //该槽函数需要用户自己完成
设置接收监听
checkBox为:
textEdit为
void Widget::ReadData()
{
//关闭串口
QByteArray arr;
//判断串口接收方式
if(ui->checkBox->checkState())
{
arr = m_port->readAll().toHex();//将数据转换成16进制
}
else
{
arr = m_port->readAll();
}
ui->textEdit->append(arr);//将数据打印到textEdit
}
串口发送数据
textEdit_2为:
checkBox_2为:
checkBox_3为:
QByteArray Data_1;
//获取输入窗口sendData的数据
QString Data = ui->textEdit_2->toPlainText();
if(ui->checkBox_3->checkState())
{
Data+='\r';Data+='\n';
}
if(ui->checkBox_2->checkState())
{
Data_1 = QByteArray::fromHex(Data.toLatin1().data());//按十六进制编码发送
}
else
{
Data_1 = Data.toUtf8();//转换成utf8格式的字节流发送
}
// 写入发送缓存区
m_port->write(Data_1);
串口关闭
关闭应写在关闭槽函数中
m_port->close();
offAndOn(true);//自定义函数,
offAndOn自定义函数,使comboBox不可再选
void Widget::offAndOn(bool status)
{
ui->comboBox->setEnabled(status);
ui->comboBox_2->setEnabled(status);
ui->comboBox_3->setEnabled(status);
ui->comboBox_4 ->setEnabled(status);
ui->comboBox_5 ->setEnabled(status);
}
status false不可选 true可选
ui->comboBox->clear(); //清空comboBox
源码:
链接:https://pan.baidu.com/s/1zgz6evCmnVrMW0CzBcjkYQ?pwd=2178
提取码:2178