鸿哥为什么串口发送一串数据时在每个字节之间加一个delay或者定时器的延时?已解答。
本帖最后由 jianhong_wu 于 2015-6-4 13:16 编辑曹健-江苏:
刚才的串口问题搞定了.是串口延时的问题,
鸿哥-深圳:
哪个延时?
曹健-江苏:
void usart_s_data(uchar uc_s_data)//发送一个字节,内部自带每个字节之间的delay延时
{
ES=0;//关串口中断
TI=0;//清零串口发送完成中断请求标志
SBUF=uc_s_data;//发送一个字节
delay_short(400);//每个字节之间的延时,这里非常关键,也是最容易出错的地方。延时的大小请根据实际项目来调
整
TI=0;//清零串口发送完成中断请求标志
ES=1;//允许串口中断
}基本就是这个问题.串口发送数据的延时出了问题.我的延时时间太短了.目前发现把发送每个字节的延时加长就行了.
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代码,时间太快就读不出来。
石头--惠州:
void usart_s_data(uchar uc_s_data)//发送一个字节,内部自带每个字节之间的delay延时
{
ES=0;//关串口中断
TI=0;//清零串口发送完成中断请求标志
SBUF=uc_s_data;//发送一个字节
delay_short(400);//每个字节之间的延时,这里非常关键,也是最容易出错的地方。延时的大小请根据实际项目来调
整
TI=0;//清零串口发送完成中断请求标志
ES=1;//允许串口中断
}
这个里面的delay_short(400)就是今天曹建碰到的关键位置,每个人的项目不同,每个人的系统处理速度不同,可能别人只要400,而曹建的需要800。这个才是关键。他接电脑就可以,板子对接就不行。所以就是传送的速度有问题。电脑肯定比较快,而板子的处理速度肯定比电脑慢,所以时间延长一点,马上就好了。
土豆づMr.--浙江:
这个时间怎么取的?
石头--惠州:
不过这里延时也不能太长,毕竟是两个字节之间的间隔,太长了,效率就会很低。自己调试的,一点一点加,一直到可以工作为止。
鸿哥-深圳:
是的。所以需要自己调试,我平时就是这样的。
欣驰-陕西:
我也遇到这个问题,昨天数据一直乱码,今天终于找到原因了,也是没加延时。
页:
[1]