【QT】串口收发

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】串口收发】如上一些处理为本人在做项目时的需求,有些地方是不必要的,且收发方式是一发一收的固定模式,若要想串口助手一样同步收发,可以配合定时器接收

    推荐阅读