8163|13

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

串口接收不定长字符处理问题 [复制链接]

单片机接收不定的长度.我想PC机到一次就当一次转行.不管长度多少.或者我发送一次协议.
也当一次命令.

最新回复

可以参考我上一楼的方法,希望对你有用。   详情 回复 发表于 2015-2-10 00:19
点赞 关注

回复
举报

66

帖子

0

TA的资源

一粒金砂(初级)

推荐
 
格式:起始符+数据长度+数据+校验码+结束符

数据长度的值由:数据的字节数来定
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
用一个长度控制域

然后,只要你的缓冲区够,想发多少就多少,不行就分包

然后,再做接包处理即可
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
不行.我要发送的长度不定的.
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
lbing怎么为包?
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

6
 
我用一个固定的长度存取我收到的数组.我怎样取得一个不定长我想要的字符.并且清除.
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
变长是有代价的,如果不用长度控制域,不可能实现

至于你看到别的高层的协议里没有长度控制,只是把数据/文件指针丢进去,然后直接就完成通信

其实这个是在下层协议里把这个事给做了,加了封装,你看不到而已

到头来还是得去处理长度这个控制信息

咱们做底层的这类东西,经常得处理这些烦琐的玩意

包,也就是一组逻辑上有相关联系的数据

以一定的规则把这个包给拆开,变成多个帧

以一定的协议送到目的地,然后再以那个规则把这个包给还原出来

当然,期间还有出错重发等等机制,这个要看你协议设计的复杂度了
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

8
 
学习了.
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 lbing7 的回复:
变长是有代价的,如果不用长度控制域,不可能实现
  
至于你看到别的高层的协议里没有长度控制,只是把数据/文件指针丢进去,然后直接就完成通信
  
其实这个是在下层协议里把这个事给做了,加了封装,你看不到而已
  
到头来还是得去处理长度这个控制信息
  
咱们做底层的这类东西,经常得处理这些烦琐的玩意
  
包,也就是一组逻辑上有相关联系的数据
  
以一定的规则把这个包给拆开,变成多个帧
  
以一定的协议…


lz赶紧记下来,这基本上是业界准则了
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

10
 
大家说的都对,不过楼主的意思我没看明白
估计楼主只是做接收部分,发送已经固定了且不属于他的工作,我认为发送是遵循相关协议的,楼主应该看看这个协议里有没有长度控制域,如果真的没有那应该有结束符,或者有结束电平信号,呵呵,我猜的,楼主最好具体说说怎么回事。
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

11
 
uping
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

12
 
chou 发表于 2009-7-4 22:37
变长是有代价的,如果不用长度控制域,不可能实现

至于你看到别的高层的协议里没有长度控制,只是把数据/文件指针丢进去,然后直接就完成通信

其实这个是在下层协议里把这个事给做了,加了封装,你看不到而已

到头来还是得去处理长度这个控制信息

咱们做底层的这类东西,经常得处理这些烦琐的玩意

包,也就是一组逻辑上有相关联系的数据

以一定的规则把这个包给拆开,变成多个帧

以一定的协议送到目的地,然后再以那个规则把这个包给还原出来

当然,期间还有出错重发等等机制,这个要看你协议设计的复杂度了
mark



 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

13
 
如同2L所说,真实商用和成熟的协议,是不可能强行要求 数据帧定长 的——当然我也见过这样的蹩脚设计。

而要数据帧不定长,这就需要协议做一定的格式定义。

另外就是。

串口接收不定长字符的问题,实际处理手法,一般是:

采用 队列 作为缓冲,只管存储接收的来的数据,然后做一个函数,根据协议格式判断是否已经收到一条完整的数据(其中一种常见做法,就是所谓的基于状态机实现的 序列检测器)

这样做目的有二:
一般来说,我们在程序里处理数据接收和数据处理都希望可以 分开处理。

1.而假如采用一般的固定数组的方式,在处理 数据接收 和 处理时 是非常不好处理的——比如说,你在中断里接收到下一条数据的数据前半部分,而你在主程序里却希望处理完上一条完整数据,并清除这些数据,这个时候,你怎么知道你应该清除到什么位置呢?
显然你不太方便处理这个问题,但是如果采用队列,这个时候我们就可以处理多少数据就清除多少数据,不影响下一条数据的接收。

2.也就是为了 分开处理 数据接收 和 数据处理;


 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

14
 
bulengzhanglang 发表于 2009-7-4 09:40
我用一个固定的长度存取我收到的数组.我怎样取得一个不定长我想要的字符.并且清除.
可以参考我上一楼的方法,希望对你有用。


 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表