赞
踩
将串口模块添加到工程中
在.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);//自定义函数,
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。