OpenEdv-开源电子网

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

串口如何合理设置发送延迟

[复制链接]

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-1-13
在线时间
28 小时
发表于 2019-5-17 23:28:03 | 显示全部楼层 |阅读模式
10金钱
用的是stm32f103c8t6,三个串口分别接了相同的传感器,传感器自身是每隔1s主动发送数据,响应时间为3s,传感器数据处理成字符串后,大概有100个字符,想通过下面的方式发送
         for(t1=0;t1<100;t1++)
           {         
                        Usart1SendChar(GET[t1]);
                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                 }//等待发送结束                         
        delay_ms(3000);
但是这个delay_ms不知道怎么设置比较好,
设置为1s以下的话,传感器本身是1s才发数

设置为1s以上的话感觉前一个还没发完,下一个已经来了。
几个问题
设置为1s是合理的吗?或者说更短的时间200ms?需不需要管传感器本身发数据的时间?
https://zhidao.baidu.com/question/351756601.html 按这个网页的话似乎一般不需要设置太大的延时?
跪求大神解决小白问题

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-5-18 02:35:53 | 显示全部楼层
你这是mcu主动发数据吧,不是接收代码
回复

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-1-13
在线时间
28 小时
 楼主| 发表于 2019-5-18 08:47:24 | 显示全部楼层
正点原子 发表于 2019-5-18 02:35
你这是mcu主动发数据吧,不是接收代码

是mcu,我只是想把传感器的数据从一个单片机以字符串的形式传到另一个单片机,然后再从第二个单片机传到第三个单片机,想知道delay怎么设置比较合适。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
发表于 2019-5-18 09:41:32 | 显示全部楼层
问题描述不清楚,
你说的是三个串口各接了传感器,
也就是说传感器是串口的,
而你的代码却是MCU主动发100字节的数据,
难怪原子有疑问。
而你后面的回帖就更乱了,三个单片机,接力传。
真的不知道你想干什么了
我的开源链接 https://github.com/ShuifaHe/STM32.git  请关注,点赞支持哦。
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-5-18 09:47:42 | 显示全部楼层
收到数据再发,不要延时
回复

使用道具 举报

0

主题

79

帖子

0

精华

高级会员

Rank: 4

积分
727
金钱
727
注册时间
2016-5-27
在线时间
91 小时
发表于 2019-5-18 10:55:18 | 显示全部楼层
1. 在中断函数中接收数据到缓存
2. 在传感器数据处理程序中不断的查询缓存是否有新的数据,接收完传感器新数据处理,处理完了就发送结果,不需要延时
3. 在主程序循环中调用数据处理程序
回复

使用道具 举报

14

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2018-7-12
在线时间
31 小时
发表于 2019-5-18 11:15:39 | 显示全部楼层
根据你的描述,你是有三个传感器和三个单片机吗?如果你是想要从传感器得到数据再传到下一个单片机的话,可以这么做:
传感器1s发送一次数据,你可以建立一个数组缓存数据,当达到三次了也就是3s,再传给下一个单片机就可以了。
回复

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-1-13
在线时间
28 小时
 楼主| 发表于 2019-5-18 15:51:55 | 显示全部楼层
本帖最后由 nabla 于 2019-5-18 15:53 编辑
warship 发表于 2019-5-18 09:41
问题描述不清楚,
你说的是三个串口各接了传感器,
也就是说传感器是串口的,

额 我详细表述下吧  其实我最初是想用ALIENTEK MiniSTM32这个板子直接接五个同样的传感器进行测试的,但是发现和屏幕还有SD卡的引脚冲突,导致只有一个传感器能正常收到数据。然后就换了一种方案,就是先用两块stm32f103c8t6板,其中第一个板子接3个传感器(因为没法接更多了啊),就是接PA10,PA3,PB11这几个接收端,然后我把接收到的数据以字符串的形式通过PA9发送给第二个板子的PA10,此时第二个板子的PA3和PB11再接剩下的两个传感器,最后同样的把之前收到的字符串和这两个传感器的数据再以字符串的形式发给ALIENTEK MiniSTM32的PA10,最后就是通过这个板子来保存到SD以及屏幕示数了。主要学艺不精,不知道怎么解决这个板子的引脚冲突,所以只好采取这种接力传的笨办法。当然就引出了我这个问题,delay设置的太长,我的最后一个板子甚至会收不到数,设置的太短,又频繁出现异常值。不好意思啊,之前表述的不太清楚
回复

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-1-13
在线时间
28 小时
 楼主| 发表于 2019-5-18 15:57:28 | 显示全部楼层
warship 发表于 2019-5-18 09:41
问题描述不清楚,
你说的是三个串口各接了传感器,
也就是说传感器是串口的,

如果可以的话,可以请您帮我看下代码吗,因为总是出现一些异常的数据,我无法判断是代码存在问题,还是传感器本身的问题,谢谢。
回复

使用道具 举报

31

主题

1955

帖子

3

精华

论坛元老

Rank: 8Rank: 8

积分
4523
金钱
4523
注册时间
2018-5-11
在线时间
947 小时
发表于 2019-5-18 16:28:46 | 显示全部楼层
本帖最后由 warship 于 2019-5-18 16:29 编辑
nabla 发表于 2019-5-18 15:57
如果可以的话,可以请您帮我看下代码吗,因为总是出现一些异常的数据,我无法判断是代码存在问题,还是传 ...

看了你的描述头都要大了,看代码估计更崩溃。
你这种同时调三个MCU,并且都是把一个串口的收发接不同的设备,
感觉不是太可取。
建议你改变方案,
如果不改变方案的话,还是慢慢调吧。
原则是:
不要眉毛胡子一把抓,学会一个问题一个问题单独解决。
你现在最要紧的是把串口通信用通用的方案解决好:
1、一定要中断方式接收   
2、开辟缓冲区用于存放接收数据  
3、编写好接收处理程序  
4、在主循环中调用接收处理程序,需要发送就直接发送(不要考虑延时的事儿!!)

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

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
143
金钱
143
注册时间
2018-9-6
在线时间
37 小时
发表于 2019-5-18 16:46:27 | 显示全部楼层
1.我建议楼主如果不是一定要采集五个传感器的真实数据的话, 可以只采集一个, 然后用这个采集到的数据, 自己模拟出另外四个, 然后做数据处理.
2.加延迟没必要,  while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET); 这句会判断当前发送数据的条件是否满足. 另外建议把

for(t1=0;t1<100;t1++)
           {         
                        Usart1SendChar(GET[t1]);
                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                 }//等待发送结束   

改成

for(t1=0;t1<100;t1++)
           {         
                      while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        Usart1SendChar(GET[t1]);
                 }//等待发送结束   

回复

使用道具 举报

7

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2019-1-13
在线时间
28 小时
 楼主| 发表于 2019-5-18 17:48:15 | 显示全部楼层
IoTCatcher 发表于 2019-5-18 16:46
1.我建议楼主如果不是一定要采集五个传感器的真实数据的话, 可以只采集一个, 然后用这个采集到的数据, 自己 ...

嗯嗯  我考虑下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 22:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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