Qt上位机串口通信调试记录
2018-12-04 17:02
495 查看
开发环境
- 系统版本:Windows 10
- 开发工具:VS2013+Qt5.4.2
- 串口类库:第三方串口类qextserialport-1.2win-alpha(下载地址:https://sourceforge.net/projects/qextserialport/?source=directory)
qextserialport目录
-
目录结构
- windows平台下用到的文件
串口设置
- 初始化对象
[code]if (Singleton::getInstance()->m_extSerialPort == NULL) { Singleton::getInstance()->m_extSerialPort = new Win_QextSerialPort(ui->comboBox_SerialPort->currentText(),QextSerialBase::EventDriven); } else { Singleton::getInstance()->m_extSerialPort->close(); } Singleton::getInstance()->m_extSerialPort->setPortName(ui->comboBox_SerialPort->currentText());
- 参数设置及打开
[code]if (Singleton::getInstance()->m_extSerialPort != NULL) { if (Singleton::getInstance()->m_extSerialPort->open(QIODevice::ReadWrite)) { Singleton::getInstance()->m_extSerialPort->setBaudRate(BAUD115200);//波特率设置,设为115200 Singleton::getInstance()->m_extSerialPort->setDataBits(DATA_8);//数据位设置,设为8位 Singleton::getInstance()->m_extSerialPort->setParity(PAR_NONE);//奇偶校验设置,设为无校验 Singleton::getInstance()->m_extSerialPort->setStopBits(STOP_1);//停止位设置,设为1位停止位 Singleton::getInstance()->m_extSerialPort->setFlowControl(FLOW_OFF);//控制流设置,设为无控制流 } }
串口写操作
[code]char *sendBuffer = (char*)malloc(FrameLengthWithoutData + 3 +2);//定义发送数组 SerialPortProtocol::CodingSerialport(sendBuffer, SystemConfig, Handshaking, Request, 0);//通信帧封装 sendBuffer[FrameLengthWithoutData + 3] = 0x0d;//帧尾添加0d 0a(换行符) sendBuffer[FrameLengthWithoutData + 3 +1] = 0x0a;//帧尾添加0d 0a(换行符) Singleton::getInstance()->m_extSerialPort->write(sendBuffer, FrameLengthWithoutData + 3 +2);//发送
备注:帧尾添加换行符,方便下位机界定数据帧结尾
串口读操作
将readyRead信号与自己的串口接收槽函数绑定,即可响应串口读数据事件
[code]connect(Singleton::getInstance()->m_extSerialPort, &Win_QextSerialPort::readyRead, m_receiveSerialportObj, &ReceiveSerialPortThreadObject::receiveRun);
备注:串口读缓冲区一有字符便会触发readyRead信号,为了保证接收数据帧的完整性,接收槽函数可以循环读(将读到的字符暂存在缓冲数组中)直到读到指定长度的字符(或者帧尾字符)
再进行数据帧解码工作,代码如下
[code] if (Singleton::getInstance()->m_extSerialPort->bytesAvailable() >0) { char readbuf[MaxDataLen]; int byte_size = Singleton::getInstance()->m_extSerialPort->readLine(readbuf, MaxDataLen); if (readbuf[byte_size - 2] != 0x0d || readbuf[byte_size - 1] != 0x0a) { bool flag = readbuf[byte_size - 2] == 0x0d && readbuf[byte_size - 1] == 0x0a; while (!flag) { if (Singleton::getInstance()->m_extSerialPort->bytesAvailable() > 0) { byte_size += Singleton::getInstance()->m_extSerialPort->readLine(readbuf + byte_size, MaxDataLen); } flag = readbuf[byte_size - 2] == 0x0d && readbuf[byte_size - 1] == 0x0a; } } if (byte_size >= (FrameLengthWithoutData + 3 + 2)) { int datalen = byte_size - FrameLengthWithoutData - 2 - 3; char* data = (char*)malloc(datalen); memset(data, 0, datalen); int leve1comm, leve2comm, flag, curfram, totalfram, device; if (SerialPortProtocol::DecodingSerialport(readbuf, byte_size - 2, data, &leve1comm, &leve2comm, &flag, &datalen, &curfram, &totalfram, &device)) serialcommand(device, curfram, totalfram, leve1comm, leve2comm, flag, QString(data)); //QString mess(data); //emit message(mess); delete data; } }
相关文章推荐
- 开源QT写的串口调试上位机(带波形显示)
- qt实现串口,UDP,TCP与嵌入式通信上位机软件
- Linux下基于QT的串口通信程序(Tiny6410)
- Qt串口持续输入数据,上位机接收端未响应问题
- 使用RXTX实现简单串口通信调试工具
- Qt编写串口通信程序全程图文讲解
- Qt编写串口通信程序全程图文讲解
- Java程序与串口的通信实现及调试
- 基于linux (fedora 17)的QT串口通信实例
- Qt编写串口通信程序全程图文讲解
- 学习记录-Qt将调试信息保存到文件
- 《Qt》part 5 Qt5.5.0串口通信
- Qt串口的使用记录
- ubuntu 下Qt串口及modbus例程调试
- C#学习与上位机开发之串口通信模块介绍
- java使用Rxtx实现串口通信调试工具
- 上位机串口通信
- Qt编写串口通信程序全程图文讲解
- 详解 Qt 串口通信程序全程图文 (1)
- QT进行UDP通信的学习(二、记录遇到的坑)