1、添加第三方qextserialport库
下载路径
https://download.csdn.net/download/qq_37016048/12442027
解压复制粘贴到工程路径,在工程文件pro文件中添加工程
include($$PWD/qextserialport/qextserialport.pri)
编译后pri库被加载到工程中。
2、串口初始化
定义如下变量、并将其初始化,因为使用需要,我将除了串口号之外的其他配置固化。
bool comOK;
//串口是否打开
QStringPortName;
//串口号
BaudRateType BaudRate;
//波特率
DataBitsType DataBit;
//数据位
ParityTypeParity;
//校验位
StopBitsType StopBit;
//停止位BaudRate = BAUD115200;
DataBit= DATA_8;
Parity= PAR_NONE;
StopBit= STOP_1;
搜索可用的串口号 ---- 我使用的时比较笨的方法一个一个去找,哪位网友知道怎么直接搜索加载可用串口号的方式,还望布不吝赐教
//搜索可用串口
QStringList Usart::FindPort()
{
QString protname;
QStringList comlist;
int i;
bool valid_port,Contain_port;
comlist.clear();
//ubuntu下串口号文件形式
for(i=0;
i<=5;
i++)
{
protname = QString("ttyUSB%1").arg(i);
com = new QextSerialPort(protname,QextSerialPort::Polling);
//Polling--异步读写EventDriven--同步读写
valid_port = com->open(QIODevice::ReadWrite);
Contain_port = comlist.contains(protname);
if(valid_port && !Contain_port)
comlist << protname;
com->close();
delete com;
}//windows下串口显示形式
for(i=0;
i<=20;
i++)
{
protname = QString("COM%1").arg(i);
com = new QextSerialPort(protname,QextSerialPort::Polling);
//Polling--异步读写EventDriven--同步读写
valid_port = com->open(QIODevice::ReadWrite);
Contain_port = comlist.contains(protname);
if(valid_port && !Contain_port)
comlist << protname;
com->close();
delete com;
}
//将其添加到下拉列表中呈现
ui->cboxPortName->clear();
ui->cboxPortName->addItems(comlist);
return comlist;
}
打开关闭串口
//打开串口
bool Usart::OpenUsart()
{
//打开端口
com = new QextSerialPort(PortName,QextSerialPort::Polling);
comOK = com->open(QIODevice::ReadWrite);
//清空缓冲区
com->flush();
//设置波特率
com->setBaudRate(BaudRate);
//设置数据位
com->setDataBits(DataBit);
//设置校验位
com->setParity(Parity);
//设置停止位
com->setStopBits(StopBit);
com->setFlowControl(FLOW_OFF);
com->setTimeout(10);
if(!comOK)
qDebug()setEnabled(false);
}
return comOK;
}
//关闭串口
void Usart::CloseUsart()
{
//关闭端口
com->close();
//改变显示状态
comOK = false;
//
ui->btnFindPort->setEnabled(true);
}
串口收发
//串口发送
int Usart::UsartSendData()
{
if(!comOK)
{
qDebug("usart is not open!");
return Error_Port;
}
else if(UsartSendLenth<=0)
{
qDebug()<<"数据发送错误";
return Error_Data;
}
//串口标记占用
UsartUseing= true;
QByteArray buffer;
buffer.resize(UsartSendLenth);
memcpy(buffer.data(),UsartSendBuff,(size_t)(UsartSendLenth));
//串口发送
com->write(buffer);
//清空串口默认控件
memset(UsartSendBuff,0,UsartSendLenth);
UsartSendLenth = 0;
//取消串口占用
UsartUseing= false;
qDebug()<<"-----串口发送完成-----";
return Success;
}
//串口接收
int Usart::UsartReadData()
{
UsartUseing = true;
QByteArray buffer = com->readAll();
if(buffer.isEmpty())
{
UsartRecvLenth = 0;
UsartUseing= false;
return Recv_Empty;
}
UsartRecvLenth = (uint16_t)buffer.length();
if(UsartRecvLenth<=0)
{
UsartRecvLenth = 0;
UsartUseing= false;
qDebug()<
【【QT】串口收发】如上一些处理为本人在做项目时的需求,有些地方是不必要的,且收发方式是一发一收的固定模式,若要想串口助手一样同步收发,可以配合定时器接收
推荐阅读
- Qt|Qt常用UI控件读取、写入方法
- Qt|Qt For Android 之启动页
- QT|QT面试
- QT安装
- qt|qt for android实现app内通过按键后台运行程序
- qt|qt for android程序保活 程序后台一直运行不被清理掉(未完)
- QWidget实现手机ipad屏幕滑屏效果
- Qt|Qt官方示例-QML Axes
- 在QT/QML中使用FontAwesome做图标显示
- QT|QtCreator2.7.0桌面快捷方式创建过程