OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5867|回复: 23

一串字符串怎么确定结束了

[复制链接]

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
发表于 2016-8-1 10:35:40 | 显示全部楼层 |阅读模式
50金钱
通过串口发送给STM32一串字符串,每次大概10几个不定,频率为0~7Hz不定,那么问题是,STM32怎么确定收到了一串完整的字符串?没有特殊字符?类似于条码扫描仪的数据采集。

最佳答案

查看完整内容[请看2#楼]

当接到字符后把它存在缓冲区里, 如果50ms之内没有接到字符,则缓冲区内是一个完整的字符串。 这种策略适用于一个数据包的各个字节连续发送,两数据包之间的间隔>50ms
最近爱上了stm32
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-8-1 10:35:41 | 显示全部楼层
当接到字符后把它存在缓冲区里,
如果50ms之内没有接到字符,则缓冲区内是一个完整的字符串。



这种策略适用于一个数据包的各个字节连续发送,两数据包之间的间隔>50ms
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11544
金钱
11544
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-8-1 10:44:48 | 显示全部楼层

按协议进行解释。

回复

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
 楼主| 发表于 2016-8-1 10:47:52 | 显示全部楼层
xuande 发表于 2016-8-1 10:44
按协议进行解释。

此话怎讲?
最近爱上了stm32
回复

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
发表于 2016-8-1 10:50:22 | 显示全部楼层
一般字符串结尾有'\0',你可以在你的协议中发送多一个0作为结尾
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11544
金钱
11544
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-8-1 10:50:29 | 显示全部楼层

数据存到缓冲区,按协议进行解释。
解释,就是判断是否满足一个完整数据帧的所有特点,
这些特点就是协议的规定。


回复

使用道具 举报

9

主题

66

帖子

0

精华

初级会员

Rank: 2

积分
147
金钱
147
注册时间
2016-7-11
在线时间
47 小时
发表于 2016-8-1 10:55:59 | 显示全部楼层
小弟刚学,认为可以在数据结束的时候发送一个0给串口,通过最后的数据位0来判断是否结束
回复

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
 楼主| 发表于 2016-8-1 10:56:35 | 显示全部楼层
以枫之名 发表于 2016-8-1 10:50
一般字符串结尾有'\0',你可以在你的协议中发送多一个0作为结尾

字符串由某传感器采集,结尾由用户设置得到,可能由0xd,可能是0x0a,也可能是两者响铃,也可能什么都能没有啊,其实就是一条码扫描仪
最近爱上了stm32
回复

使用道具 举报

44

主题

260

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2012-3-8
在线时间
29 小时
发表于 2016-8-1 10:58:54 | 显示全部楼层
我用过一款串口条形码扫描仪,发送过来的字符串是带了换行的,'\n'或者'\r'
回复

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
 楼主| 发表于 2016-8-1 11:14:17 | 显示全部楼层
以枫之名 发表于 2016-8-1 10:58
我用过一款串口条形码扫描仪,发送过来的字符串是带了换行的,'\n'或者'\r'

结束符由用户扫码设置,,,,,根据结束符是万不可行的。。。
最近爱上了stm32
回复

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
 楼主| 发表于 2016-8-1 11:14:35 | 显示全部楼层
xkwy 发表于 2016-8-1 11:01
当接到字符后把它存在缓冲区里,
如果50ms之内没有接到字符,则缓冲区内是一个完整的字符串。

试试。。。。。。。。。。
最近爱上了stm32
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-8-1 11:23:16 | 显示全部楼层
每个字符有接收超时即可【因为不同波特率每个字符接收有超时时间的】
回复

使用道具 举报

9

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
228
金钱
228
注册时间
2016-7-4
在线时间
47 小时
发表于 2016-8-1 11:23:43 | 显示全部楼层
按协议解析或发送结束符‘\0’
回复

使用道具 举报

58

主题

6294

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11544
金钱
11544
注册时间
2014-4-1
在线时间
1315 小时
发表于 2016-8-1 11:44:50 | 显示全部楼层

帧间隔也可以用于判断,
但最后总要解码的。

回复

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
 楼主| 发表于 2016-8-1 21:49:54 | 显示全部楼层
365mcu 发表于 2016-8-1 11:23
每个字符有接收超时即可【因为不同波特率每个字符接收有超时时间的】

这个可以一试
最近爱上了stm32
回复

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
 楼主| 发表于 2016-8-1 21:50:27 | 显示全部楼层
xuande 发表于 2016-8-1 11:44
帧间隔也可以用于判断,
但最后总要解码的。

能说明白点吗
最近爱上了stm32
回复

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2016-8-2 08:15:19 | 显示全部楼层
以前有用过超时处理。后面都是用的fifo 缓存, 串口中断里面有数据直接放进FIFO,然后用个任务扫 出列的FIFO,如果有收到数据,再延时个10ms 再判断是否有数据(判断当前的数据是已经结束了,还是一直在产生数据)
这样就能收完整一帧了。
1-1
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-8-2 09:01:34 | 显示全部楼层

他意思按你描述一条报文(即一帧数据)与下一条报文有时间间隔的[和字节超时一个道理],接收到报文其实你还要判断接受的是不是一条正确的豹纹的(即解码),怎么判断报文对不对要根据你数据格式来验证了。
回复

使用道具 举报

5

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2014-11-26
在线时间
25 小时
发表于 2016-8-2 09:13:35 | 显示全部楼层
本帖最后由 1376115749 于 2016-8-2 09:15 编辑

http://wapwenku.baidu.com/view/7c2c7637fd0a79563d1e7279.html  把这个看完你就懂了,应该知道怎么处理了
回复

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
 楼主| 发表于 2016-8-3 09:14:08 | 显示全部楼层
1376115749 发表于 2016-8-2 09:13
http://wapwenku.baidu.com/view/7c2c7637fd0a79563d1e7279.html  把这个看完你就懂了,应该知道怎么处理了

这个还是没看懂,数据链路层是自己在软件部分中加的吗,EOF结束标志不是也要判断一帧数据的结尾吗?还望指点!
最近爱上了stm32
回复

使用道具 举报

5

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2014-11-26
在线时间
25 小时
发表于 2016-8-3 09:57:39 | 显示全部楼层
带我足够强大 发表于 2016-8-3 09:14
这个还是没看懂,数据链路层是自己在软件部分中加的吗,EOF结束标志不是也要判断一帧数据的结尾吗?还望 ...

这个已经讲的很明白了,你做的就是在接受超时的情况下,解析接收buffer里面的数据,根据自己定义的帧的格式来解析
回复

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
 楼主| 发表于 2016-8-3 10:07:47 | 显示全部楼层
1376115749 发表于 2016-8-3 09:57
这个已经讲的很明白了,你做的就是在接受超时的情况下,解析接收buffer里面的数据,根据自己定义的帧的格 ...

那还是超时啊,我怎么看到里面说超时不是很好的办法啊
最近爱上了stm32
回复

使用道具 举报

5

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
235
金钱
235
注册时间
2014-11-26
在线时间
25 小时
发表于 2016-8-3 12:52:11 | 显示全部楼层
带我足够强大 发表于 2016-8-3 10:07
那还是超时啊,我怎么看到里面说超时不是很好的办法啊

这个超时很短的,就比如我连续发了5个字符,第五个字符完成后,总线在一个字符的时间内接收不到数据就认为总线空闲了,也就我所说的超时,这样你就可以认为数据完成了,然后解析buffer
回复

使用道具 举报

35

主题

181

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1115
金钱
1115
注册时间
2016-8-1
在线时间
235 小时
发表于 2016-8-3 13:15:41 | 显示全部楼层
一般我比较常用两个字节接收的相隔时间来判断,这种比较通用
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-8 15:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表