首页
博客
专栏课程
下载
问答
社区
会员中心
论坛
代码
直播
Chrome 插件
能力认证
导航
全部
Ada助手
...
Ada助手
登录/注册
社区
单片机/工控
帖子详情
关于在单片机上如何接收不等长数据包的问题。
ws84643557
2011-09-28 04:38:13
我想在单片机上接收数据包,然后根据数据包的内容进行switch操作。现在问题是数据包的长度最短3字节,最长是7字节。要怎么通过串口来接收到这些数据包,并得到数据包的长度。注意,是在单片机上的程序,由于单片机上的串口只能一位一位地接收,所以还不知道怎么做,就算用DMA的话,也是只能接受固定长度的数据,所以现在不知道怎么做。
有过类似经验的人可以指点一下思路吗,谢谢。
PS:我用的是STM32的单片机。
...全文
给本帖投票
483
19
打赏
收藏
关于在单片机上如何接收不等长数据包的问题。
我想在单片机上接收数据包,然后根据数据包的内容进行switch操作。现在问题是数据包的长度最短3字节,最长是7字节。要怎么通过串口来接收到这些数据包,并得到数据包的长度。注意,是在单片机上的程序,由于单片机上的串口只能一位一位地接收,所以还不知道怎么做,就算用DMA的话,也是只能接受固定长度的数据,所以现在不知道怎么做。 有过类似经验的人可以指点一下思路吗,谢谢。 PS:我用的是STM32的单片机。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
测温电路中惠斯通桥的固定电阻的阻值如何确定啊 我用的是PT100做热敏 那其他三个阻值如何确定
>>
19 条
回复
切换为时间正序
请发表友善的回复…
发表回复
发表回复
按下Enter换行,Ctrl+Enter发表内容
编辑
预览
轻敲空格完成输入
显示为
卡片
标题
链接
打赏红包
hb_haitao2009
2011-10-09
打赏
举报
回复
使用FIFO存放接收到的数据,然后根据自己定的通信协议找出FIFO中数据头的位置
zjk2752
2011-10-09
打赏
举报
回复
楼上的方法可行
miaozhendaoren
2011-10-01
打赏
举报
回复
我是个初学者,简单的还有点想法,后面的我就赶不上了,坐观求解,并试图弄懂楼主后面说的一堆东西!
ws84643557
2011-09-29
打赏
举报
回复
上面那条是让DMA接收完整个数据包,然后获得接收到的数据个数。。
其实我为什么要做这个呢,我有一个叫iNEMO的模块,这里面的传输数据是用USB转串口的方式,就是用STM32自带的USB模拟出一个串口出来,然后通过这个虚拟串口和PC用上面我说的协议通讯。USB转串口的通讯方式就是用数据包的嘛,所以上位机的串口如果发送一个数据包(比如5个字节)到这个模块的话,这个单片机上的虚拟串口就是接收到一个5个字节的数据包,然后在单片机上获得数据包的长度赋给一个全局变量countout和数据包的内容,最后用这个countout和数据包的内容一起在switch里面执行相应的命令。因为这个USB转串口的接收中断和定时器中断是同抢断优先级的,所以不会被定时器给中断了。(这个模块的资料里面有源程序,但是文档里面却没有讲,所以这都是我自己理解的,可能有些不对的地方)。
但是在这里,我想用单片机和这个模块通讯,OTG的东西没用过,所以打算从模块引出的实际串口接口来和单片机通讯,上位机发送完命令,单片机用串口返回数据的我已经做好了,现在就是不知道怎么从串口发一个数据包的命令给这个模块来通讯,如果解决了这个问题,那么就可以用单片机和这个模块通讯了。但是现在就是不知道怎么做。由于代码里面有个FreeRTOS操作系统,所以我找不到那个while(1){}的死循环,而我又不怎么懂操作系统,所以我希望能在中断中一次过把数据包的内容全接收了。就想USB的中断一样!~
谢谢LS这么多位的指点。。确实帮助很大!~
galle
2011-09-29
打赏
举报
回复
在接收时判断即可,
比如初始状态用变量st,设为0.用switch语句判断st 如果=0,说明接收的是文件头。
判断文件头对不对,文件头对,状态st=1,接收字节数,st=2,在st=2时接收够字节数个字节后就可以判断了,判断完后,st=0.依次类推,st设为全局变量!
ws84643557
2011-09-28
打赏
举报
回复
这个方法不错。我之前没有说清楚,就是这里还有一个定时器中断,我希望在接收到完整的数据包之前,不被这个定时器中断打断,所以我希望能不能在一次中断中把数据包全接收了(当然,我感觉把定时器中断关了,之后再打开也行),我刚刚突发奇想,我用USART的DMA模式接受整个数据包,然后打开USART的接收中断,在第一个数据接收到之后延时一会儿,让DMA把整个数据包读出来,然后获得接收到的数据个数,不知道这样可以不可以,我现在就去试试。有谁知道这样可以不可以呢??[Quote=引用 10 楼 miaozhendaoren 的回复:]
1.接收一个字节,判断若接收到的值是否为0x20,不是则丢弃,并重新接收,是则继续;
2.接收第二个字节,读取值,赋值給count,继续接收;
3.接收第三个字节,count--,count==0?,是则接收完成,置标或者其他啥的,否则继续;
4.接收第...个字节,并count--,直到count==0,然后置标,返回执行其他任务,或者重新接收下一帧。
[/Quote]
ws84643557
2011-09-28
打赏
举报
回复
不错,谢谢LS,这个挺有用的,谢谢提醒哈!~[Quote=引用 12 楼 miaozhendaoren 的回复:]
1.接收这个任务是满足什么条件下进行的?是一直就监听的,实时响应的,还是满足其他条件然后再接收的,这个任务受什么驱动的? 什么情况下开始一个接收?应定义好接收任务驱动。
2.接收是怎样一个过程?一个接收任务中要接收多长的数据?满足什么条件就是接收完成了?应定义好接收过程,可能接收过程还有一些复杂的如校验和处理之类的东西。
3.接收完成后 要做什么?数据就放在哪儿 什么都不做,还是再驱动其他任务……
[/Quote]
miaozhendaoren
2011-09-28
打赏
举报
回复
1.接收这个任务是满足什么条件下进行的?是一直就监听的,实时响应的,还是满足其他条件然后再接收的,这个任务受什么驱动的? 什么情况下开始一个接收?应定义好接收任务驱动。
2.接收是怎样一个过程?一个接收任务中要接收多长的数据?满足什么条件就是接收完成了?应定义好接收过程,可能接收过程还有一些复杂的如校验和处理之类的东西。
3.接收完成后 要做什么?数据就放在哪儿 什么都不做,还是再驱动其他任务,驱动条件是什么。
AnYidan
2011-09-28
打赏
举报
回复
lz 看看 modbus 的协议
miaozhendaoren
2011-09-28
打赏
举报
回复
1.接收一个字节,判断若接收到的值是否为0x20,不是则丢弃,并重新接收,是则继续;
2.接收第二个字节,读取值,赋值給count,继续接收;
3.接收第三个字节,count--,count==0?,是则接收完成,置标或者其他啥的,否则继续;
4.接收第...个字节,并count--,直到count==0,然后置标,返回执行其他任务,或者重新接收下一帧。
ws84643557
2011-09-28
打赏
举报
回复
命令的基本格式是 前缀 + 后面字节数 + 命令名称 (+参数)
比如 0x20(前缀) + 0x01(后面1字节) + 00(connect)
如果是7字节的命令的话就是
0x20 + 0x05 + 50(set output mode) + 0x1f + 0x18 + 0x00 + 0x05 (后面四个是参数)
我就是想要获取这样的一些数据包。。而且还要获取数据包长度,用串口,请问怎么破!~
ws84643557
2011-09-28
打赏
举报
回复
如果说命令的已经设定好了,我这边只负责接收接受数据包呢。要怎么接收呢。
bjtea
2011-09-28
打赏
举报
回复
命令的格式可以有长短之分,例如,常见的一帧命令格式:
两字节帧头标识 + 1字节命令类型 + 字节数(长度) + 多字节的命令内容 + 1字节累加和校验 + 2字节帧尾标识
lbing7
2011-09-28
打赏
举报
回复
除了LS说的不等长的处理方式以外,一般还有两种方式:
1.在数据中包含长度,读取长度得到要接收的数据量
2.以时间分割,一帧数据和另一帧数据之间以一定的时间长度作为分割
大概就是,在开始第一个字节接收后,将连续接收,直接S时间外再也没有数据接收到的话,视接收到的数据为一帧
以上处理起来就好办了。。。
northcan
2011-09-28
打赏
举报
回复
自己定义一个简单的通信协议。所有数据包的收发要遵循这个协议。
比如:
包头 + 数据和校验 + 数据 + 包尾
0xf0 + 0x5a + 0xXX + 0x01 + 0x02 + 0xa5 + 0xf0
f0 5a作为数据的包头,接收到f0 5a才代表一个数据包的开始。当然这里数据包头可以设置的复杂点。
第二个字节是整个数据包的所有数据相加结果。
之后是一个字节一个字节的实际数据。
最后加一个包尾,比如a5 f0,接收到这个数据,才代表一个数据包的结束。
当然数据包尾也可以设置的稍复杂点。
forch
2011-09-28
打赏
举报
回复
首先你要先做一个字节一个字节接收的程序,然后把数据存储在缓冲区,最后才是从缓冲区取出数据根据协议来解析到底是3个字节的包还是7个字节的包。
ws84643557
2011-09-28
打赏
举报
回复
主要是串口一个字节的接收数据,但是我要等到什么时候才知道一个数据包结束啦!~而且数据包没有结束位!
ws84643557
2011-09-28
打赏
举报
回复
我的程序时通过把接收到的数据包长度赋给一个count_out变量,然后通过判断这个变量不为零来利用数据包的内容来进行操作,所以获得数据包长度,很重要,求解答,谢谢!~
hit97
2011-09-28
打赏
举报
回复
根据通信协议写啊,肯定是有规则的
以太网芯片mac/phy的关系
问:如何实现单片以太网微控制器? 答:诀窍是将微控制器、以太网媒体接入控制器(MAC)和物理接口收发器(PHY)整合进同一芯片,这样能去掉许多外接元器件.这种方案可使MAC和PHY实现很好的匹配,同时还可减小引脚数、缩小芯片面积.单片以太网微控制器还降低了功耗,特别是在采用掉电模式的情况下. 问:以太网MAC是什么? 答:MAC即Media Access Control,即媒体访问控制子层协议.该...
STM32F4_nRF24L01无线通讯
目录前言: 1. nRF24L01无线模块简介2. nRF24L01状态机3. nRF24L01模式4. nRF24L01的SPI配置4.1 nRF24L01 Rx 和 Tx 的初始化配置4.2 nRF24L01相关寄存器5. 硬件连接6. 实验程序6.1 main.c6.2 NRF24L01.c6.3 NRF24L01.h nRF24L01是一款工作在 2.4~2.5GHz 世界通用 ISM 频段的单片无线收发器芯片。无线收发器包括:频率发生器、增强型 模式控制器、功率放大器、晶体振荡器、调
单片机
至PC数据传输实践指南
数据帧是数据封装之后在物理链路上进行传输的基本单位。一个标准的数据帧通常包括以下几个部分:帧起始和结束标志:用于标识数据帧的开始和结束,如使用特殊字符序列。地址字段:指示源和目标节点地址,用于路由选择和
数据包
定位。控制字段:包含有关帧传输方式、优先级等控制信息。数据字段:实际传输的数据内容。校验字段:用于错误检测和校验数据的完整性。随着物联网技术的发展,智能家居系统逐渐走入寻常百姓家。
串行异步通信_详解串行通信协议及其FPGA实现
详解串行通信协议及其FPGA实现前言好久没更新博客了,这篇文章写写停停,用了近一周的时间,终于写完了。本篇文章介绍,串口协议数据帧格式、串行通信的工作方式、电平标准、编码方式及Verilog实现串口发送一个字节数据和
接收
一个字节数据。对于MCU串口的发送
接收
,可能就是1行代码就能实现串口的发送和
接收
:STM32的串口
接收
和发送//STM32发送1个字节 USART_SendData(USART1,...
TMS320C6455高速SRIO接口设计
引 言 数字信号处理技术已广泛应用于通信、雷达、声纳、遥感、图形图像处理和语音处理等领域。随着现代科技的发展,尤其是半导体工艺的进入深亚微米时代,新的功能强劲的高性能数字信号处理器(DSP)也相继推出,如ADI(美国模拟器件)公司的TigerSHARC系列和TI(德州仪器)公司的C6000系列,但是,要实现对运算量和实时性要求越来越高的DSP 算法,如对基于分数阶傅立叶变换的Ch
单片机/工控
27,511
社区成员
28,797
社区内容
发帖
与我相关
我的任务
单片机/工控
硬件/嵌入开发 单片机/工控
复制链接
扫一扫
分享
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
加入社区
获取链接或二维码
积分榜
荣誉榜
原力榜
学习榜
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章
手机看
关注公众号
客服
返回
顶部