独闷闷网

 找回密码
 立即注册
搜索
查看: 2350|回复: 0
收起左侧

[原创] 鸿哥为什么串口发送一串数据时在每个字节之间加一个delay或者定时器的延时?已解答。

[复制链接]
发表于 2014-12-17 18:30:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 jianhong_wu 于 2015-6-4 13:16 编辑

曹健-江苏:
刚才的串口问题搞定了.是串口延时的问题,

鸿哥-深圳:
哪个延时?

曹健-江苏:
  1. void usart_s_data(uchar uc_s_data)//发送一个字节,内部自带每个字节之间的delay延时
  2. {
  3.         ES=0;//关串口中断
  4.         TI=0;//清零串口发送完成中断请求标志
  5.         SBUF=uc_s_data;//发送一个字节
  6.         
  7.         delay_short(400);//每个字节之间的延时,这里非常关键,也是最容易出错的地方。延时的大小请根据实际项目来调


  8.         
  9.         TI=0;//清零串口发送完成中断请求标志
  10.         ES=1;//允许串口中断
  11. }
复制代码
基本就是这个问题.串口发送数据的延时出了问题.我的延时时间太短了.目前发现把发送每个字节的延时加长就行了.

Inc-东莞:
这里干嘛要延时?你不知道你这样写是用延时代替TI?这里这样写是不可取的。

石头--惠州:
其实没必要每发送一个字节就延时一下。

Inc-东莞:
如果延时不够长,TI还没置位,表示发送还没完成,他就直接把TI清0,导致发送错误。正确应该这样:while((!TI)&&(ms<250)){ms++;}这样才能完善。这个ms你调才算没关系。如果采取你这种办法,延时不够,那么错误,如果延时太多,只会错等。

鸿哥-深圳:
这里的延时是我提出来的,必须加的。这个延时的目的不是完全替代跟TI。其实我还是坚持我那种写法,直接加delay,或者也可以用累加定时器中断次数的延时方式,不要判断TI。因为如果延时不够,发送自然会出错的,这时我们自然会调整延时。但是如果TI一旦满足就发送下一个字节,这样的数据发送很不稳定的,因为我以前遇到过。在51,PIC单片机上是会存在这种问题。而在stm32貌似不会这样。如果你连续发送一串数据的时候,不加延时,很容易出错。今天曹健也是因为这个问题引起的。我以前也是因为这个问题在很多项目上遇到过。

Inc-东莞:
在我们采用校验,定时器检测,如果这样延时空等,这就浪费了CPU的效率。采用了定时器检测,和接收校验,我可以说不会出现这种问题,采用FIFO接收,没有问题。串口本来就是很慢的一个东西,很成熟了,是不会轻易出现这种问题的。除非是接受的方式不对。

鸿哥-深圳:
这个跟FIFO和校验没关系。这个延时是跟硬件抗干扰有关。一旦因为这个延时导致数据发送不稳定,你会一直发送出错,不是偶尔出错的问题。这个只是我的经验。我确实在发送一串数据的时候经常遇到这个问题,加延时就很好了。而且这个延时的时间其实很短的,跟浪费CPU没关系,当然,也可以把delay延时改成累计定时中断次数的延时方式。在51,PIC单片机中,在发送一串数据的时候,每个字节之间加延时是我分享给大家的一个很重要的经验。这个延时的大小要自己根据项目来做调整。其实这个很容易调试,一旦发现数据丢失出错,只要调整一下这个延时,往往能马上见效。

MCU编程-华力:
这个与I2C相类似,写I2C代码,时间太快就读不出来。

石头--惠州:
  1. void usart_s_data(uchar uc_s_data)//发送一个字节,内部自带每个字节之间的delay延时
  2. {
  3.         ES=0;//关串口中断
  4.         TI=0;//清零串口发送完成中断请求标志
  5.         SBUF=uc_s_data;//发送一个字节
  6.         
  7.         delay_short(400);//每个字节之间的延时,这里非常关键,也是最容易出错的地方。延时的大小请根据实际项目来调


  8.         
  9.         TI=0;//清零串口发送完成中断请求标志
  10.         ES=1;//允许串口中断
  11. }
复制代码
这个里面的delay_short(400)就是今天曹建碰到的关键位置,每个人的项目不同,每个人的系统处理速度不同,可能别人只要400,而曹建的需要800。这个才是关键。他接电脑就可以,板子对接就不行。所以就是传送的速度有问题。电脑肯定比较快,而板子的处理速度肯定比电脑慢,所以时间延长一点,马上就好了。

土豆づMr.--浙江:
这个时间怎么取的?

石头--惠州:
不过这里延时也不能太长,毕竟是两个字节之间的间隔,太长了,效率就会很低。自己调试的,一点一点加,一直到可以工作为止。

鸿哥-深圳:
是的。所以需要自己调试,我平时就是这样的。
欣驰-陕西:
我也遇到这个问题,昨天数据一直乱码,今天终于找到原因了,也是没加延时。


乐于分享,勇于质疑!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|独闷闷网 ( 粤ICP备12007667号-2 )

GMT+8, 2021-6-18 09:53 , Processed in 0.133495 second(s), 19 queries .

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