如何在串口通讯程序中处理数据包

Android 串口开发——粘包解决方法,定时查询心跳数据,解析心跳数据。 【代码】Android 串口开发——粘包解决方法,定时查询心跳数据,解析心跳数据。 阅读详情

如何在串口通讯程序中处理数据包

◆龚建伟技术主页◆      龚建伟 2001.10.30

 

       在串口通讯程序中,经常要收到数据包,常有网友问及如何从这些数据包中提取需要的数据,如何处理校验等,在这篇文章里我举两个例子予以说明,程序说明为VC++6.0。关于串口编程建立程序的细节,请参阅我主页上的其它文章。同时,此文也适于其它通讯程序中艰数据报文的处理。

    首先,应该指出的是,所有这些处理均在串口事件处理函数oncommunication()中进行。每当串口缓冲区中有一个或一个以上字符时触发串口通讯事件,该事件就驱动(调用)串口事件通讯处理函数oncommunication(),在这里就可以对接收到的数据进行处理,提取需要的数据。

举两个例子,一个是较为简单的位数据格式的处理,另一个是NMEA无线通讯格式的处理,最后回答一位网友提出的问题,大家也可以探讨一下。

1.问题:

一个数据包,其串头为一个字符,字符值为7EH(16进制)'~',其后紧跟一字符‘E’,然后是数据串,串尾也为字符值为7EH的一个字符:
即 ~Exxxxxx...~ 如何处理这些数据?
我们仍以串口调试助手源程序及其详细编程过程之一 中的OnComm()处理为例:
void CSCommTestDlg::OnComm() 
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放

m_strRXData+=strtemp; //加入接收编辑框对应字符串,在这儿,编辑框不是必须的,可做相应处理
char ch=(char)bt;
if(ch=='E')
{ 
//在此处设置一个可以接收数据的全局标志,说明接收到数据前的‘E’标志了,下一步可以读数据了,同时将m_strRXData清空
        flag=2;
         m_strRXData.Empty(); //下一次接收的便为有用的数据
}
if(ch==0x7e) 
{
      flag=1; //下面可以提取数据了
}
if(flag==1) //标志为1,
{
     ...//提取数据
        flag=0; //提取完后,置标志为0
}

}
}
//UpdateData(FALSE); //更新编辑框内容
}


2 NMEA无线通讯格式的处理

2.1 NMEA-0183报文格式

字符串(ASCII字符)格式如下:
$XXXX,XX,XX,XX,……*hh<CR><LF>
$:串头
XXXX: 串头
XX:数据字段,字母或数字
XX:数据字段,字母或数字
XX:数据字段,字母或数字
,:逗号
……
*:星号,串尾
hh:$与*之间所有字符代码的校验和,(注意:校验和h为半Byte校验,*后第1个h表示高4位校验和,第2个h表示低4位校验和。得到校验值后,再转换成ASCII字符。)
<CR>:0DH,回车控制符
<LF>:0AH,换行控制符

2.2 校验处理

由于数据是动态接收,所以数据的处理也是动态进行,尽管有时会收到几个字符才触发一个串口事件,但字符的接收是一个一个接收的,因此就可以在程序中先判断串头$是否到达,若串头到达,就可以开始计算校验,直至串尾*到达,这时*号后面的两个字符就是校验码,收到这两个校验字符,就可以与自己计算的校验值比较,若不正确,就报错,并继续处理下面的数据,若正确,则处理接收的字符,提取需要的数据。


2.3 程序
CString m_strReceived;
CString m_strChecksum;
int flag;
char ch为每次收到的字符


m_strReceived += (char)ch;
switch(ch)
{
case '$':
checksum=0; //开始计算CheckSum
flag=0;
break;
case '*':
flag=2;
c2=checksum & 0x0f; c1=((checksum >> 4) & 0x0f);
if (c1 < 10) c1+= '0'; else c1 += 'A' - 10;
if (c2 < 10) c2+= '0'; else c2 += 'A' - 10;
break;
case CR:
break;
case LF:
m_strReceived[port-1].Empty();
break;
default:
if(flag>0) 
{
m_strChecksum += ch;
if(flag==1) 
{
strCheck=strCheck+c1+c2;
if(strCheck!=m_strChecksum) 
{
m_strReceived.Empty();
}
else
{
strInstruction=m_strReceived[port-1].Left(6);
if(strInstruction=="$QGOKU") //如果串头正确
{
char *temp=(char*)((LPCTSTR)m_strReceived);//转换

int speed=(atoi(temp+7));// 提取int 型数据
char splevel=*(temp+25); //提取 char 型数据

}

}
m_strChecksum.Empty();
}
flag--;
}
else
checksum=checksum^ch;
break;
}



3 网友的问题

另外,我回答了一位网友的问题,大家也可以探讨一下:
问题如下3:

我用你的串口程序收来的十六进制数据是这个样的:
00 10 10 C0 00 F0 F0 AB AC AD
我现在要将高四位取出来,也就是
011C0FFAAA(这点我不会,但我用Left实现了,可得到的是字符,不是我要的数值)
我只要011C0FF.
我要把011C0FF进行如下的处理
011转化成十进制
C不变
0FF也变成十进制
后显示,成 17 C 255

答:右移得到011C0FF后,可将其放在一个字符型变量CString m_strReceive中:
然后将其转换:
char *temp=(char*)((LPCTSTR)m_strReceive;

char tbuf[6]; //temporary viable 
tbuf[0]=temp[1]; tbuf[1]=temp[2]; tbuf[2]=temp[3]; tbuf[3]=0; //011 最后为0表示结束
int data1=atoi(tbuf);
char chdata2==temp[4]; //C
tbuf[0]=temp[5]; tbuf[1]=temp[6]; tbuf[2]=temp[7]; tbuf[3]=0;
int data3=atoi(tbuf); //0FF

以上data1,chdata2,data3即为你要的数据
 

 

请点击图片进入 ◆龚建伟技术主页◆

串口通迅(编程源码)、串口调试助手、端口网络通信技术,VC/C编程,移动机器人控制相关技术,Matlab仿真及数据处理 

 
 
串口通信-STM32的USART串口通讯程序 串口是显控设备与信号处理板之间通信的主要接口,也是显控设备与其他设备、设备与设备之间的协议数据帧通信传输的重要接口。串口通信指串口按位(bit)发送和接收字节。尽管比特字节(byte)的串行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。串口通信协议是指规定了数据包的内容,内容包含了起始位、主体数据、校验位及停止位,双方需要约定一致的数据包格式才能正常收发数据的有关规范。串口通信协议是基于串口使得通信双方能够相互沟通信息的一种约定,其定义了双方遵循的协议数据帧格式和其传输方式。 阅读详情

相关推荐

VB.NET中串口通讯延时程序

<br />大家好,最近我在使用VB.NET开发串口通讯的一点内容,在使用VB.NEI对嵌入式控制器编程,给下位机通讯发命令数据的时候,发现有时候发一次,下位机没有收到,为了增强程序的可靠性,我想延时100毫秒,在发送一次,不知道怎样些延时程序,使用定时器还是有专门的API函数调用,希望有经验的师傅可以给点指点,最好些清楚点,怎样在窗体开头生命API以及如何在需要使用延时程序的地方调用,谢谢<br />你好,如果我用Sleep() API做延时程序使用,那这种演示会不会影响我在程序中使用的定时器,我要用定时

mlh548的专栏 1324

安卓与串口通信-数据分包的处理

前言 本文是安卓串口通信的第 5 篇文章。本来这篇文章不在计划内,但是最近在项目中遇到了这个问题,正好借此机会写一篇文章,在加深自己理解的同时也让大伙对串口通信时接收数据可能会出现分包的情况有所了解。其实关于串口通信会可能会出现分包早有耳闻,但是我自己实际使用时一直没有遇到过,或者准确的说,虽然遇到过,但是并没有特意的去处理:分包?不就是传过来的数据不完整嘛,那我把这个数据丢了,等一个完整的数据不...

Android技术之家 1330

一步一步实现基于COMSOL的单模光纤波导仿真

一步一步实现基于COMSOL的单模光纤波导仿真,简单易懂,跟着博客就能实现

君莫笑lucky的博客 1万+

初识Android串口通信

因为平时工作是基于串口通信开发,之前群里有人问串口通信怎么搞,正好自己也想总结一下平时开发经验,便准备写几篇关于串口通信的文章。串口是一种用于在计算机和其他设备之间传输数据的通信接口。串口通常是通过一对传输数据的线来实现通信的,其中一条线传输数据(称为数据线),另一条线传输控制信号(称为控制线)。串口通常使用串行通信协议来传输数据,其中每个字节按照位的顺序一个接一个地传输。串口常用于连接计算机与外部设备,如打印机、调制解调器、传感器等。串口的主要特点是通信速度比较慢,但传输距离可以很长。

xiaokangss的博客 4308

九齐NY8A051F低功耗模式全解析:从待机到休眠的省电实战

本文全面解析台湾九齐NY8A051F MCU的低功耗模式,从待机到休眠的省电实战技巧。通过实测数据展示四种工作模式的电流消耗差异,提供模式切换的标准流程和唤醒时序优化策略,并分享外围电路省电设计和低电压检测的实战应用,帮助开发者实现物联网设备的超长续航。

weixin_30839881的博客 407

Intel MKL库常用模块的C语言实现

文章目录1. 随机数生成1.1 等概率的01分布 viRngUniform1.2 (复)高斯分布 vsRngGaussian2. 向量-向量运算2.1 向量数乘与加法 cblas_caxpby2.2 向量内积 cblas_cdotu_sub2.3 向量范数 cblas_scnrm23. 矩阵-向量运算3.1 矩阵存储方案3.2 矩阵-向量乘法 cblas_cgemv4. 矩阵-矩阵运算4.1 矩阵...

月半 月半的博客 4650

串口中怎样接收一个完整数据包的解析

这里以串口作为传输媒介,介绍下怎样来发送接收一个完整的数据包。过程涉及到封包与解包。设计一个良好的包传输机制很有利于数据传输的稳定性以及正确性。串口只是一种传输媒介,这种包机制同时也可以用于SPI,I2C的总线下的数据传输。在单片机通信系统(多机通信以及PC与单片机通信)中,是很常见的问题。 一、根据帧头帧尾或者帧长检测一个数据帧 1、帧头+数据+校验+帧尾 这是一个典型的方案,但是对帧头与

铸剑娃的专栏 3万+

Win11家庭版如何让Win+R运行CMD默认管理员权限?3种方法实测有效

本文针对Win11家庭版用户,实测了三种让Win+R运行CMD默认获取管理员权限的有效方法。通过分析UAC机制与家庭版功能限制,详细介绍了注册表编辑、快捷方式创建与任务计划程序三种方案的原理、步骤与风险对比,帮助用户根据安全与效率需求选择最佳方案,实现一键高效管理。

sat99的博客 1267

simulink接收串口数据_关于串口自由通信的几个问题

串口通信是常见的通信方式,串口接口是大部分工控器件标配的通信接口。在项目开发的过程中,也经常遇到进行串口通信的处理。这里就串口通信的部分问题分享给大家。1、TTL、RS232、RS422、RS458这几种通信接口有什么区别?TTL:TTL是一种芯片的电平信号,其电平电压一般为5V或3.3V;RS232:RS232通信有三根线,分别为发送TX、接收RX、信号参考GND;发送与接收信号的电平范围为±1...

weixin_39697096的博客 1315

从SOMEIP看SOA,汽车电子电器架构的转变

从SOMEIP看SOA,汽车电子电器架构的转变

天赐好车的博客 241

〖Python WEB 自动化测试实战篇⑤〗- selenium 元素定位详解 - (八大元素定位方式)

测试对象的定位和操作是我们利用 selenium 编写自动化脚本和 webdriver 的核心内容,其中 "操作" 这一部分又是建立在 "selenium" 元素定位的基础之上的。所以对元素对象的定位就显得越发的重要,接下来我们就学习一下常用的元素定位方法有哪些。......

易编橙 · 终身成长社群,相遇已是上上签! 4万+

在串口通讯程序中处理数据包

在串口通讯程序中,经常要收到数据包,常有网友问及如何从这些数据包中提取需要的数据,如何处理校验等,在这篇文章里我举两个例子予以说明,程序说明为VC++6.0。关于串口编程建立程序的细节,请参阅我主页上的其它文章。同时,此文也适于其它通讯程序中艰数据报文的处理。

1438

【agent实操】OpenClaw玩转股票分析多个AI智能体(agent)出谋划策

本文介绍了一个基于OpenClaw的多Agent股票分析系统。该系统采用"三人组+总调度"模式,包含三个核心Agent:小牛马(策略中枢)、牛老二(基本面分析师)和牛老三(技术面分析师)。相比单Agent模式,该系统具有分析更专业、权限分级更安全、成本控制更优等优势。文章详细说明了系统部署的6个步骤,包括创建独立Agent工作区、配置专属人设与技能等,并提供了环境检查命令和验证方法。通过这种多Agent协作的方式,可以实现更专业、更安全的股票分析。

海兰 807

单片机与PC机多机通讯 串口通信

下面是我写的一个实现多个下位机(单片机)与一个上位机(PC机)的一主多从串口通讯程序,用的STC89C52RC,定时器2做串口通信波特率发生器。      实现功能是这样的:      用调试助手向单片机发送一个数据包。      通讯协议是这样的:       数据包的格式如下所示(共10个字节组成): 0x2A,0xEB,0x8D,地址码,指令码,数据长度码,数据码,数据码,校验码,

sinat_29430043的博客 3247

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

dsPIC33F串口通讯中断接收发送数据-UART

/* **************************************************************** ** 功能描述: 串行通讯程序,DSP中断收到8个数据后,将收到的8个数 据以中断发送方式返送回发送方。 *************************************************************** */ #include

Augusdi的专栏 8401

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

stm32 串口发送数据第一字节丢失

使用stm32f10x调试串口通讯时,发现一个出错的现象,硬件复位重启之后,发送测试数据0x01 0x02 0x03 0x04..接收端收到的数据为:0x02 0x03 0x04,第一个数据丢失。 查阅stm32f10x参考手册,找到这样一句话: TC:发送完成 当包含有数据的一帧发送完成后,由硬件将该位置位。如果USART_CR1中的TCIE为1,则产生中断。由软件序列清除该位...

weixin_30312563的博客 154

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

串口接收处理思路

串口接收处理思路

宁静致远 1479

stm32串口发送数据包进行解析,实现人机交互

之前在正点原子的官方历程中我们就可以看到,在串口中断服务函数里面,对接受的数据用一个十六位的数据来判断是否接受完成(即是否在数据包的末尾接收到0x0D,0x0A,他们分别对应的是\r \n),利用高位处理状态,低位则将数据包。你可能会有一个疑问就是,为什么HEX的包头包尾设置为0xFF与0xFE,这是因为,如果在数据包中存在一样的数值,可能会导致接受混乱的时候,这两个数据是影响比较小的,毕竟接受的。1,串口的中断处理函数,在接受到数据中断以后,根据之前提到的状态机的知识判断数据的有效性;

爱吃炸鸡的小猪's blog 9412

USART串口协议——串口发送接收以及串口收发数据包

Receiver/Transmitter)通用同步/异步收发器(1)USART是STM32内部集成的硬件外设,可根据数据寄存器的一个字节数据自动生成数据帧时序,从TX引脚发送出去,也可自动接收RX引脚的数据帧时序,拼接为一个字节数据,存放在数据寄存器里(2)自带波特率发生器,最高达4.5Mbits/s(3)可配置数据位长度(8/9)、停止位长度(4)可选校验位(无校验/奇校验/偶校验)(5)支持同步模式硬件流控制DMA智能卡IrDA(用于红外通信的)LIN(局域网的通信协议)

qq_45419343的博客 4669

arduino串口接收数据包_串口通讯

常见的通讯接口有USART、CAN、USB、Ethernet。最常见、用的最多的就是USART,下面主要对串口通讯协议的物理层及协议层进行讲解。物理层 串口通讯的物理层有很多标准及变种,主要讲解RS-232标准,RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。 使用RS-232标准的串口设备间常见的通讯结构见图1 图1 串口通讯结...

weixin_40006763的博客 2147

UART串口通讯

如果要理解串口通讯,就必须对串行和并行,同步和异步有一定的了解提示:以下是本篇文章正文内容,下面案例可供参考UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种双向、串行、异步的通信总线,仅用一根数据接收线和一根数据发送线就能实现全双工通信。典型的串口通信使用3根线完成,分别是:发送线(TX)、接收线(RX)和地线(GND),通信时必须将双方的TX和RX交叉连接并且GND相连才可正常通信串口采取的是TTL协议关于这点可以看看这个。

qwqqwqqwqqwqqwqa的博客 1266

51单片机之串口通讯

串口,全称串行通信接口或串行通讯接口(通常指COM接口),是一种常用于电子设备间通讯的全双工扩展接口。串口通讯的技术基础,指一位一位地按顺序传送数据。其特点是线路简单,只需一对传输线,即可实现双向通信,大大降低成本。串行收发模块是串口的现实载体,负责实现串行通讯,被集成到各种计算机设备中。其中,应用最广的是USART(Universal Synchronous/Asynchronous Receiver/Transmitter)——通用同/异步串行接收/发送器。

weixin_44453694的博客 1555

【K230 CanMV】UART K210与STM32串口通信 发送接收数据包 附源码

本文围绕 K230 处理器的 UART 外设功能展开,详细介绍了串口通信的基本原理、配置方法以及在 CanMV IDE 中的使用方式。文章首先阐明了串口的基本概念及其工作原理,接着对 K230 的 UART 外设进行了详细解析,介绍了如何配置引脚、初始化 UART 外设以及设置波特率、数据位等参数。通过一系列实际案例,本文展示了如何在 K230 上进行数据的发送与接收,包括如何处理字节数组和文本数据的接收。进一步地,文章通过串口回环测试示例,帮助读者验证 UART 通信的可靠性。

你要拥有一个你喜欢并且热爱的人生 1万+

【STM32】STM32学习笔记-USART串口收发HEX和文本数据包(29)

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式, 电子工程师在调试设备时也经常使用该通讯方式输出调试信息。在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性, 确保原始数据在物理媒体的传输。

Print World的专栏 6096

SerialPort 串口通讯 通讯协议

关键字 SerialPort 串口通讯 通讯协议原作者姓名 戚高文章原始出处 原创 介绍由于工作关系几个月没有接触Internet了,回来发现很多朋友给我写了信,其中很多一部分都是关于串口方面出现了问题。由于在以前的工程实施过程中关于串口通讯我有时用MSCOMM控件,有时自己用WIN32 API直接操作串口。后来还试验了网络上面很流行的SerialPort类。在工业控制过程中间我对Serial

paobo的专栏 1万+
上一篇: VC中在基于单文档(SDI)程序中应用MSCOMM串口通讯控件编程详细说明(附源程序)
下一篇: VC中基于文档(SDI/MDI)程序中能直接用串口MSComm通讯控件吗?
roaringwind
博客等级 码龄25年 19粉丝 11原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值