OpenEdv-开源电子网

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

串口发送一帧数据时,两个字节的间隔时间是多少??

[复制链接]

49

主题

160

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2017-11-2
在线时间
41 小时
发表于 2018-5-21 10:09:24 | 显示全部楼层 |阅读模式
20金钱
串口发送一帧数据时,两个字节的间隔时间是多少??

最佳答案

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

这位大侠为什么老问些奇怪的问题,当然和波特率有关。莫名其妙
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

49

主题

160

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2017-11-2
在线时间
41 小时
 楼主| 发表于 2018-5-22 16:19:17 | 显示全部楼层
本帖最后由 LIGONG004 于 2018-5-22 16:42 编辑

串口通信,
1.先在串口接收中断里一个字节一个字节的接收,放入缓存中,同时记下收到字节个数
2.在主程序里,就是main()函数里循环检查, 判断分析 ,是不是待处理的数据.
     2.1  如果符合处理条件,即刻处理, 同时清缓存,  
字节个数,
     2.2  如果不符合处理条件,不预处理,等待下一轮循环再作判断;
                                     (处理条件,一个很重要的判断因素就是接收的字节长度)
3.如果在一定时间里(main
循环次数), 接收字节的数量没有变化, 而又数据不符合处理条件,     作为无效数据丢弃.  同时清缓存,  清字节个数;
接收中断只管去接收,不管main()指令执行到哪里,当然不是只收一个字节就去处理


回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-5-21 10:09:25 | 显示全部楼层
这位大侠为什么老问些奇怪的问题,当然和波特率有关。莫名其妙
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-5-21 10:30:42 | 显示全部楼层
楼上正解
回复

使用道具 举报

49

主题

160

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2017-11-2
在线时间
41 小时
 楼主| 发表于 2018-5-21 10:45:05 | 显示全部楼层
和波特率有啥关系?
波特绿只是位传熟输,  字节之间可不以波特率来算,

字节之间,  前一停止位------后一起始位  间隔
回复

使用道具 举报

8

主题

206

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1010
金钱
1010
注册时间
2016-4-6
在线时间
234 小时
发表于 2018-5-21 10:52:15 | 显示全部楼层
特地用逻辑分析仪采了一下,都是级别。。楼主可以看图 1.png
回复

使用道具 举报

49

主题

160

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2017-11-2
在线时间
41 小时
 楼主| 发表于 2018-5-21 11:03:09 | 显示全部楼层
兄弟,
你的拨特率多少啊?  
回复

使用道具 举报

49

主题

160

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2017-11-2
在线时间
41 小时
 楼主| 发表于 2018-5-21 11:09:16 | 显示全部楼层
我的心拔凉拔凉啊,

中间只是4.296uS,
这么短的时间我能干啥?能执行几条指令啊?

4.296   /  (1/72   uS)
回复

使用道具 举报

49

主题

160

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2017-11-2
在线时间
41 小时
 楼主| 发表于 2018-5-21 11:12:24 | 显示全部楼层
我的串口是  9600bpS
回复

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3888
金钱
3888
注册时间
2017-3-7
在线时间
1694 小时
发表于 2018-5-21 11:19:22 | 显示全部楼层
不知道你要做什么?一帧数据要处理做什么动作?
回复

使用道具 举报

117

主题

598

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
1702
金钱
1702
注册时间
2012-5-10
在线时间
439 小时
发表于 2018-5-21 11:22:28 | 显示全部楼层
你这样的设计肯定不行啊,不要在中断里做逻辑处理,一个字节可以作为完整的指令,最好的是中断接收数据,保存在队列,另开任务,读取队列,处理数据
如有技术问题,微信扫头像交流,STM32,JAVA,服务器
回复

使用道具 举报

49

主题

160

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2017-11-2
在线时间
41 小时
 楼主| 发表于 2018-5-21 12:32:30 | 显示全部楼层
我要接收一串字节数据,  我想每接收一个字节就处理一下,
这样速度快,

但是我又怕我处理跟不上, 还没处理完成,  下一个字节又来了,
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-5-21 13:03:18 | 显示全部楼层
9600bps的速率在通信里属于非常慢的了,
关键问题是没有像你那么处理数据的,
要开缓存处理数据的.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

0

主题

192

帖子

0

精华

高级会员

Rank: 4

积分
582
金钱
582
注册时间
2017-6-2
在线时间
192 小时
发表于 2018-5-21 13:08:15 | 显示全部楼层
串口字节间其实可以认为没有间隔的,8位数据位1位起始位1位停止位 无校验位,基本上一个字节就是10位需要的时间。接收一般用简单状态机判断帧头后缓存就可以了。用中断接收的话,你的处理时间就是这10位数据的时间,接收是硬件操作不占cpu。足够你做简单判断,之后扔进缓存就好了。可以做简单帧头判断,如果帧长也在起始部分就更省事了,可以直接把一帧数据放进缓存,具体解析后面再做就好了
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2018-5-21 13:46:11 | 显示全部楼层
串口是自动接发的,写到寄存器,自动的完成的,完成后,你只要开中断,中断处理。不影响你系统干别的活
回复

使用道具 举报

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
发表于 2018-5-21 14:42:26 | 显示全部楼层
xsx127 发表于 2018-5-21 11:22
你这样的设计肯定不行啊,不要在中断里做逻辑处理,一个字节可以作为完整的指令,最好的是中断接收数据,保 ...

您好,请问您这种方法,是在主循环中处理数据吗?如何去处理数据?怎样防止队列溢出?又如何防止队列数据被覆盖?当有大量数据来时,如何能及时的处理?我一直想不明白怎样去做这种大量的串口数据处理。能简单讲讲吗
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-5-21 14:52:06 | 显示全部楼层
wangmingwei093 发表于 2018-5-21 14:42
您好,请问您这种方法,是在主循环中处理数据吗?如何去处理数据?怎样防止队列溢出?又如何防止队列数据 ...

开一片缓存, 大小根据数据量而定, 以程序能够及时处理不会溢出为原则,
设置两个指针(用数组下标也行)
一个是收指针, 一个是处理指针
来一个数据就存入缓存, 收指针++;
处理一个数据就: 处理指针++(要保证处理指针不要超越收指针就行了)
另外注意缓存是循环使用的, 到尾就接着从头开始(注意指针数值的判别)
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

49

主题

160

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2017-11-2
在线时间
41 小时
 楼主| 发表于 2018-5-21 17:02:29 | 显示全部楼层
老夫准备测试一下,

到时候会告诉你们最佳处理办法,

你们静侯佳音,
回复

使用道具 举报

49

主题

160

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2017-11-2
在线时间
41 小时
 楼主| 发表于 2018-5-21 17:03:59 | 显示全部楼层
明天下午测试,
回复

使用道具 举报

15

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
795
金钱
795
注册时间
2015-3-26
在线时间
151 小时
发表于 2018-5-22 16:30:38 | 显示全部楼层
当然是中断去触发的管它指令执行到哪里,当然要做异步,当然不是只收一个字节就去做事情
回复

使用道具 举报

49

主题

160

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2017-11-2
在线时间
41 小时
 楼主| 发表于 2018-5-22 16:39:34 | 显示全部楼层
xyl210xyl 发表于 2018-5-22 16:30
当然是中断去触发的管它指令执行到哪里,当然要做异步,当然不是只收一个字节就去做事情

不错   OK   
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-5-22 21:50:23 | 显示全部楼层
这个是通用的处理方法了,思路清晰, 根本不用什么清缓存,隔一段时间判断什么的,
只要你的处理器够快, 基本可以做到实时, 有不明白的可以问我!!

开一片缓存, 大小根据数据量而定, 以程序能够及时处理不会溢出为原则,
设置两个指针(用数组下标也行)
一个是收指针, 一个是处理指针
来一个数据就存入缓存, 收指针++;
处理一个数据就: 处理指针++(要保证处理指针不要超越收指针就行了)
另外注意缓存是循环使用的, 到尾就接着从头开始(注意指针数值的判别)
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-5-22 22:27:46 | 显示全部楼层
本帖最后由 warship 于 2018-5-29 09:04 编辑

#define BUFFERSIZE 100   //缓冲区大小根据情况调整
u8 Buffer[BUFFERSIZE];
u16 RxPoint=0, ProPoint=0;  //定义全局变量收指针, 处理指针

中断接收程序中:
Buffer[RxPoint++]=RxData;     //RxData为新收到的数据
if(RxPoint>=BUFFERSIZE)RxPoint=0;

主程序中:
while(ProPoint!=RxPoint){ProData=Buffer[ProPoint++];  
//处理一下读到的数据ProData
if(ProPoint>=BUFFERSIZE) ProPoint=0;
}

我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-5-23 07:21:04 来自手机 | 显示全部楼层
本帖最后由 warship 于 2018-5-29 09:08 编辑

上面的循环中请自行插入你需要对读取的数据进行处理
即"//处理一下读到的数据ProData" 的位置.
回复

使用道具 举报

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
发表于 2018-5-28 09:46:58 | 显示全部楼层
warship 发表于 2018-5-21 14:52
开一片缓存, 大小根据数据量而定, 以程序能够及时处理不会溢出为原则,
设置两个指针(用数组下标也行)
...

那么有没有这样一种可能:接收数据的速度比处理数据的速度快,那么这时候肯定会导致缓冲区满,如何避免这种情况?
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4522
金钱
4522
注册时间
2018-5-11
在线时间
947 小时
发表于 2018-5-28 13:06:00 | 显示全部楼层
本帖最后由 warship 于 2018-5-28 13:23 编辑
wangmingwei093 发表于 2018-5-28 09:46
那么有没有这样一种可能:接收数据的速度比处理数据的速度快,那么这时候肯定会导致缓冲区满,如何避免这 ...

没有这种情况出现,
因为如果有这种可能的话,
你在设计之初就需要避免,
要么降低串口最高允许速率,
要么选用更高速的处理器(连串口数据都处理不过来,这个处理器岂不是废物?!).开缓冲的目的不是因为CPU处理不过来,
而是怕因为CPU有时候忙着干别的, 漏掉了部分数据的处理.

问题的前提一定是选用的CPU足够快,
处理串口来的数据绰绰有余.
而且CPU不止干这一件事,
开缓存的目的就是让CPU有空去干别的(允许串口有一定数量的暂时存放空间),
而不是一直等在那里处理串口数据.
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

52

主题

334

帖子

0

精华

高级会员

Rank: 4

积分
560
金钱
560
注册时间
2016-4-12
在线时间
230 小时
发表于 2018-5-29 08:31:43 | 显示全部楼层
warship 发表于 2018-5-28 13:06
没有这种情况出现,
因为如果有这种可能的话,
你在设计之初就需要避免,

谢谢你的答复,疑问了好久的问题
回复

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
60
金钱
60
注册时间
2018-7-11
在线时间
11 小时
发表于 2018-7-18 09:56:28 | 显示全部楼层
了解了 不过还有很多问题待解决
回复

使用道具 举报

10

主题

67

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
283
金钱
283
注册时间
2018-6-30
在线时间
42 小时
发表于 2018-7-18 10:34:08 | 显示全部楼层

参考一下*火的GPS解码程序,串口接收用DMA方式自动存入缓存里,根本不影响CPU的运行
另外采用双缓存,一个负责接收数据,另一个填充满了归当前计算所用,由于串口接收数据并不快,且一帧数据达256字节,因此CPU处理数据没有一点压力。
回复

使用道具 举报

1

主题

231

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2872
金钱
2872
注册时间
2018-1-24
在线时间
258 小时
发表于 2018-9-18 14:57:11 | 显示全部楼层
楼主测试结果是什么,怎么没有结果了啊???????????
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 23:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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