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

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

接口操作MySQL跟MongoDB事务回滚问题

通常使用的事务注解:@Transactional 是不会对MongoDB生效的,但是在一些生产接口中无法避免同时使用MySQL跟MongoDB的操作。

weixin_45932023的博客 1578

初识Android串口通信

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

xiaokangss的博客 4308

【Matlab 六自由度机器人】基于改进型D-H参数的运动学建模与蒙特卡洛工作空间分析

本文详细介绍了如何使用改进型D-H参数法为六自由度机器人建立运动学模型,并利用Matlab Robotics Toolbox实现正运动学计算与可视化。通过蒙特卡洛法对机器人工作空间进行分析,生成三维点云图以直观展示其可达范围,为机器人选型与任务规划提供关键依据。

weixin_29040367的博客 438

本地部署 Anything LLM+Ollama+DeepSeek R1 大模型并实现外部访问

DeepSeek 一经发布就引起社会的广泛的关注,因为 DeepSeek 的价格低廉,性能卓越,提供了多种使用方式,满足不同用户的需求和场景。本文将详细的介绍如何在本地 Windows 上安装部署 Anything LLM + Ollama 来实现用户和 DeepSeek-r1 对话的功能以及利用路由侠内网穿透实现外网访问。

lyxnwct的博客 1895

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

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

铸剑娃的专栏 3万+

Jupyter地铁数据分析预测地铁后7天小时客流量

地铁数据分析 基于八月地铁刷卡数据,以前23天的数据作为训练数据,预测后7天各个地铁站点在6点—23点每个小时的客流量。 import pandas as pd import time import numpy as np import matplotlib.pyplot as plt ...

qq_45868915的博客 1753

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

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

weixin_39697096的博客 1315

RTK_ROS_导航(4):接入move_base

现在我们要将之前的数据接入到Move_base中,使得机器人能够根据Map上的终点进行导航,并且实现避障效果如下图。

旋风小短腿 1946

【OpenClaw从入门到精通】第60篇:多智能体协同实战——用“龙虾”搭建你的数字员工团队(2026企业版)

2026年AI Agent企业落地的核心趋势,正从“单Agent单兵作战”转向“多智能体协同组网”。本文以全球开发者先锋大会“百虾大战”真实案例为蓝本,深度拆解OpenClaw多智能体协同的技术内核——三层解耦架构(模型层-技能层-网关层),系统搭建包含项目经理、架构师、执行者、质量把关者的4大核心Agent团队。通过三种主流协作架构对比、全链路配置代码实操、故障自愈实战演练,结合电商新品上架虚拟场景全流程演示,解决企业多Agent部署中的权限隔离、任务协同、运维自治三大核心痛点。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 768

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

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

1438

YOLOv11模型剪枝实战:让检测速度翻倍,精度仅降1%的终极优化教程

模型剪枝是YOLOv11落地边缘场景的“关键一步”——它让模型在“瘦身”的同时,几乎不损失精度。从稀疏化训练到通道剪枝,再到工程部署,本教程已为你打通全流程。现在就动手尝试,让你的YOLOv11模型在嵌入式设备、移动端上也能“飞起来”——相信我,当你看到剪枝后的模型在资源受限设备上仍能精准检测时,你会明白这份技术的价值。

m0_64661770的博客 711

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

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

sinat_29430043的博客 3247

Java的API帮助文档

JDK帮助文档 SUN公司为JDK工具包提供了一整套文档资料,我们习惯上称之为JDK文档。 JDK文档中提供了Java中的各种技术的详细资料,以及JDK中提供的各种类的帮助说明。 JDk文档是Java语言的完整说明,大多数书籍中的类的介绍都要参照它来完成,它是编程者经常查阅的资料 如何理解API:就当做是一个“字典”,“使用手册”,API就相当于是一个电子的帮助文档,可以帮我们查看JDK提供的类的信息,平时查看的时候可结合百度一起看。 官网下载: 1、登录Oracle官网(Oracl.

人生得意须尽欢 2万+

老版QQ原生表情gif动态

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

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

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

Augusdi的专栏 8401

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

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

weixin_30312563的博客 154

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

串口接收处理思路

串口接收处理思路

宁静致远 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、付费专栏及课程。

余额充值