qt实现串口调试助手

串口初始化

串口调试助手的初始化,一般包括波特率、端口号、奇偶校验、数据位和停止位。如果最终需要将串口商业化,一般这些参数都会交给用户自定义,但我们写了自己用,且上位机和下位机同时开发,则除了端口号,其余参数都会在代码里面定义好。
端口号一般采用自动扫描更新可用串口的方式,比直接列举COM1、COM2等要好很多。

 //参数初始化global_port.setBaudRate(QSerialPort::Baud115200);  //波特率global_port.setParity(QSerialPort::NoParity)  ;   //无奇偶校验global_port.setDataBits(QSerialPort::Data8);    //8位数据位global_port.setStopBits(QSerialPort::OneStop);  // 1位停止位
    //定时扫描和更新串口timer = new QTimer;connect(timer,&QTimer::timeout,this,&MainWindow::showValidPort);//实时更新端口号timer->start(1000); //每1000ms定时检测串口状态foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) //扫描可用串口portStringList += info.portName();ui->comboVolt1->addItems(portStringList);//将扫描的端口号添加到下拉框

自定义通信协议

为了避免数据传输过程中丢失,我们不会直接接收并使用下位机发送的数据,而是拟定通信协议,包括设置帧头、数据位长度、数据、校验位、帧尾等。这样可以通过对帧头、帧尾的检验,防止数据在传输过程中有丢失。
下图是我根据自己的需求拟定的通信协议,一般如果能通过校验位的校验和帧头帧尾的检测,就说明数据在传输过程中没有丢失。

上位机的接收

通信协议拟定好了,上位机的接收也是有讲究的,因为上位机不可能一次性正好接收以上的全部内容,而且我们传输的数据也有可能包含帧头帧尾等对应的ASCII码,为了防止误接收,一般我们设置一个缓冲区去接收数据,接收完一帧之后在处理
这下面的代码其实还有点问题,就是出现校验失败等问题之后,没有清除缓冲区重新接收,后面会再改进

 if((!array.contains("{"))&&buffer.isNull())//异常:头部丢失{return ;}//第一种,有头无尾,附加if(array.contains("{")&&(!array.contains("}"))){// buffer.clear();buffer.append(array);}//第二种:无头无尾且变量已有内容,数据中段部分,继续附加即可if((!array.contains("{"))&&(!array.contains("}"))&&(!buffer.isNull())){buffer.append(array);}//第三种:无头有尾且变量已有内容,已完整读取,附加后可做处理if((!array.contains("{"))&&(array.contains("}"))&&(!buffer.isNull())){buffer.append(array);is_readall = true;}//第四种:有头有尾(一段完整的内容),已完整读取if((array.contains("{"))&&(array.contains("}"))){buffer.append(array);is_readall = true;}if(is_readall)//缓存区有头有尾,已完整读取{qDebug() <<"buffer_size:";qDebug() <<buffer.size();//输出长度for(int i = 0;i<buffer.size();i++){if((uint(uint(buffer.at(i))&0xff))==123)//定位帧头{start = i+1;qDebug() <<"start:";break;}}DATA_LEN = ((uint)(buffer.at(start)))&0xff ;//帧头后接通道数qDebug() <<DATA_LEN;start++;if (index < BUFFERSIZE) index++;for(int i = 0;i<DATA_LEN;i++)//接收通道数后跟的数据{if (index >= BUFFERSIZE)  array_signal.at(i).pop_back();uint buf_0 = ((uint)buffer.at(4 * i+start)<< 24)& 0xff000000;uint buf_1 = ((uint)(buffer.at(4 * i + 1+start)) << 16)& 0x00ff0000;uint buf_2 = ((uint)(buffer.at(4 * i + 2+start)) << 8)  & 0x0000ff00;uint buf_3 = ((uint)(buffer.at(4 * i + 3+start)) )&0x000000ff ;uint buf = buf_0 + buf_1 + buf_2 + buf_3;sum+=buf_3;//校验和orginal_signal.at(i).insert(orginal_signal.at(i).begin(),(float)(buf));//buf = buf/1000;array_signal.at(i).insert(array_signal.at(i).begin(),(float)(buf));//if(max_range[i]<buf) max_range[i] = buf;if(min_range[i]>buf) min_range[i] = buf;}is_readall = false;sum = sum&0xff;checksum = (uint)(buffer.at(buffer.size()-2))&0xff;//检查校验位if(checksum == sum){qDebug() <<"checkcum successful!";}else{qDebug() <<"checkcum failed!";}if((uint)(buffer.at(buffer.size()-1))== 125)//帧尾{qDebug() <<"end!";}buffer.clear();

下位机的发送

串口助手肯定是需要下位机通过串口将数据发给上位机,不管是上位机的发送还是下位机的接收,都要跟通信协议对应上,相比之下,下位机的发送就很简单了,如果想要定时发送,就开个定时器,否则直接while(1)里面发送就行了。
以下是对应的下位机发送格式,使用的是STM32F1的板子

void send_resistance_value(u32 *value,int len)
{u8 temp1;u32 temp,sum = 0;int i = 0;USART_SendData(USART1, '{');//帧头1while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束USART_SendData(USART1, len&0xff);//帧头1while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束for(;i<len;i++){temp = value[i];temp1 = (temp&0xff000000)>>24;USART_SendData(USART1, temp1);//向串口1发送最高位while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束temp1 = (temp&0xff0000)>>16;USART_SendData(USART1, temp1);//向串口1发送次高位while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束temp1 = (temp&0xff00)>>8;USART_SendData(USART1, temp1);//向串口1发送次低位while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束temp1 = (temp&0xff);USART_SendData(USART1, temp1);//向串口1发送最低位while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束sum+=temp1;//校验和     }temp1 = sum&0xff;USART_SendData(USART1, temp1);//发送校验和while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束USART_SendData(USART1, '}');//帧尾while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
}

qt做串口调试助手——通信收发篇相关推荐

  1. QT实现串口调试助手(七):字体设置面板创建及窗体间传值

    上一篇: QT实现串口调试助手(六):页面布局 QT串口工具相关文章链接 一般串口调试工具都有修改串口接收框字体的功能面板,我们也来加一个: 1.先创建一个字体设置面板 比如我们创建一个widget, ...

  2. 基于QT的串口调试助手制作

    目录 1.创建文件 2.串口界面制作 3.代码 4.结果 5.改进 6.百度链接 1.创建文件 创建带有ui界面的qt程序,可以点击文件-新建文件或项目就会出现上面的界面,选这Application( ...

  3. 基于QT的串口调试助手设计

    一. 开发环境和工具 1. WIN10系统 2. QT5.4.0(C++) 二. 创建QT项目 ① 选择"Qt Widgets Application" ② 选择项目存放路径及名称 ...

  4. 【Qt串口调试助手】1.1 - Qt5编写串口调试助手,Qt串口编程

    这章来学习串口数据流操作.仿照已有成品制作一个用Qt开发的串口调试助手. 介于篇幅有限,本篇只介绍一个最简单的能收发的串口调试助手的制作.后续篇幅会陆续对剩余代码进行讲解,并添加各种功能,对显示.操作 ...

  5. 串口调试助手源代码 qt编写 带协议解析 帧判断 通信数据保存等功能

    串口调试助手源代码 qt编写 带协议解析 帧判断 通信数据保存等功能 使用说明介绍 1.功能介绍: 采用Qt编写的串口调试助手工具,功能齐全,除了具备十六进制收发及文件保存等基本功能外,还具有以下功能 ...

  6. 【Qt串口调试助手】1.2 - 串口数据接收不发生换行,CH340 / CP2102 多硬件兼容

    上一篇提到:对串口接收的显示,使用的是当前位置插入+移动鼠标光标到末尾的方式.这种方法可以有效解决 串口数据接收发生换行的问题,并且解决 CH340 / CP2102 多硬件显示结果不一致的问题.那有 ...

  7. 【Qt串口调试助手】1.0 - 400行代码撸一个Qt5串口调试助手框架

    1. 设计目的 使用Qt设计一款串口调试助手,具有自动扫描串口端口.列表端口硬件信息.16进制转换.收发数目统计.定时发送等功能.代码注释清晰,应用无内建缓存区,运行效率高,适合拿来学习和作为二次开发 ...

  8. 【Qt串口调试助手】1.5 - 发送/接收字节数量统计

    对发送/接收的字节数目计数,显示到底部状态栏中. GitHub源码:Qt串口调试助手下载 接收字节数计数 (1)在 mainwindow.h文件中创建 收发数属性,再创建两个 标签指针,用于显示收发数 ...

  9. C#开发串口调试助手实现modbusRTU通信

    今天给大家搞个项目,跟我来,走过路过不要错过,看大V如何玩C#工业软件开发,搞事的目的是:掌握MODBUSRTU通信协议,掌握简单型串口调试助手开发,掌握串口通信过程 硬件产品:串口RS232温湿度传 ...

最新文章

  1. JVM第三篇 — JVM是怎么工作的?
  2. Android开发之根据Service的生命周期特点后台连接网络下载图片(源代码分享)
  3. k8s nodeport下访问请求未被分发到所有node的排错(转)
  4. 推荐系统笔记(开源工具)
  5. 用springmvc 开发为 app 提供后台服务遇到跨域请求的问题
  6. 使用Hadoop Streaming 完成MapReduce(Python代码)
  7. Windows10 + WSL (Ubuntu) + Anaconda + vscode 手把手配置python运行环境(含虚拟环境)
  8. Didn‘t find class “android.view.View$OnUnhandledKeyEventListener“,Didn‘t find class “androidx
  9. android求助:关于播放器中的“播放/暂停”键: 用ImageButton来设置点击效果时的问题...
  10. 广数系统980tdb系统说明书_不同数控系统中各个倒角指令的用法
  11. 机器学习(7)——Logistic回归(从疝气病症预测病马的死亡率)
  12. C语言编程题:简单的a+b
  13. Qt Quick Controls
  14. 中国心率监测器行业市场供需与战略研究报告
  15. Foxmail邮箱提示错误:ssl连接错误,errorCode:5解决方法
  16. Mendix装备制造业应用 | 云上全流程透明性备品备件协同管理
  17. linux rs,Linux中的RS, ORS, FS, OFS
  18. js随机选学员。从以下学员名单中随机选出4个学员。
  19. DOjo的一个幻灯片播放例子
  20. 机器学习系列(一)—— 绪言

热门文章

  1. 冬奥会区块链亮点:数字雪花、冰墩墩NFT
  2. 杂议 Windows 和 Linux
  3. 数据结构 --- c语言实现哈夫曼树
  4. 【程序7】输出特殊图案,请在c环境中运行,看一看,Very Beautiful!(vc乱码解决版)
  5. Python 备份文件
  6. 用MotionBuilder修正小甜甜的跑步动作
  7. Android打开系统自带文件管理器,选择指定类型的文件
  8. 国网智能电表DLT645/DLT698.45协议规约驱动解析说明及命令示例
  9. 自学者的python编程之路001
  10. 基于无监督的单深度估计