1、添加第三方qextserialport库
下载路径
https://download.csdn.net/download/qq_37016048/12442027
解压复制粘贴到工程路径,在工程文件pro文件中添加工程
include($$PWD/qextserialport/qextserialport.pri)
编译后pri库被加载到工程中。
2、串口初始化
定义如下变量、并将其初始化,因为使用需要,我将除了串口号之外的其他配置固化。
bool comOK; //串口是否打开
QString PortName; //串口号
BaudRateType BaudRate; //波特率
DataBitsType DataBit; //数据位
ParityType Parity; //校验位
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()<<PortName<<"串口打开失败";
else
{
qDebug()<<PortName<<"串口打开成功";
ui->btnFindPort->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()<<UsartRecvLenth<<"数据接收错误";
return Error_Data;
}
qDebug()<<"串口接收数据长度"<<UsartRecvLenth;
memcpy((void *)UsartRecvBuff,buffer.data(),UsartRecvLenth);
UsartUseing = false;
return Success;
}
如上一些处理为本人在做项目时的需求,有些地方是不必要的,且收发方式是一发一收的固定模式,若要想串口助手一样同步收发,可以配合定时器接收