鸿哥开发板关于串口双机通信延时问题整理
这里干嘛要延时曹健-江苏 2014-12-17 17:36:54
不知道
Inc-东 2014-12-17 17:36:58
为毛要用延时
Inc-东 2014-12-17 17:37:01
你不知道你这样写》?
Inc-东 2014-12-17 17:37:11
用延时代替TI?
Tony--青 2014-12-17 17:37:20
@Inc-东莞 他是拿来主义者
Inc-东 2014-12-17 17:37:35
这里这样写是绝对不可取的
Tony--青 2014-12-17 17:37:43
估计时间长了会出问题
Inc-东 2014-12-17 17:37:50
不是
石头--惠 2014-12-17 17:38:00
@曹健-江苏 其实没必要每发送一个字节就延时一下
Inc-东 2014-12-17 17:38:16
如果延时不够长,TI还没置位,表示发送还没完成,他就直接把TI清0,导致发送错误
曹健-江苏 2014-12-17 17:38:26
我目前的水平是拿来主义很多问题吃不透
石头--惠 2014-12-17 17:38:33
只需要在启动串口中断,发送第一个字节价格小延时
曹健-江苏 2014-12-17 17:38:39
你们给我讲再多不能用我就认为是不行的
Inc-东 2014-12-17 17:38:46
这样顶多拿来演示一下还可以,用在工程上,如果是我领导看到我这样写,you are fire
17:39:01
Tony--青 2014-12-17 17:39:01
file:///C:\DOCUME~1\123\LOCALS~1\Temp\K08@7VM_1{NL9ER12UNXU94.gif
Inc-东 2014-12-17 17:39:02
不能用延时来代替
风雪--重 2014-12-17 17:39:07
file me
曹健-江苏 2014-12-17 17:39:12
我是领导 我就会说just do it
石头--惠 2014-12-17 17:39:16
我这边串口发送启动函数:
Inc-东 2014-12-17 17:39:17
我的答案是,绝对不能
石头--惠 2014-12-17 17:39:18
void DownLoad_Uart1(void)
{
UART1ENABLE();
RS485SEND_SERVER();
DelayNs_RS485();
gbTXBusyUart1 = true;
gcComStateUart1 = CS_SEND_BOOT1;
U1THR = CF_START;
}
Inc-东 2014-12-17 17:39:20
那行
鸿哥-深 2014-12-17 17:39:21
@Inc-东莞
这个延时的目的不是完全替代跟TI,等你以后多做一些串口你就知道为什么必须加这个延时。
Tony--青 2014-12-17 17:39:25
鸿锅file:///C:\DOCUME~1\123\LOCALS~1\Temp\V@S07CYW_M@`U%PL%RPS`BW.gif
曹健-江苏 2014-12-17 17:39:55
do what you want do,never give up,you are the best
鸿哥-深 2014-12-17 17:40:17
@Inc-东莞
这里的延时是我提出来的,必须加的。
Inc-东 2014-12-17 17:40:26
@鸿哥-深圳 正确应该这样:while((!TI)&&(ms<250)){ms++;}
Inc-东 2014-12-17 17:40:33
这样才能完善
Inc-东 2014-12-17 17:40:41
这个ms你调才算没关系
鸿哥-深 2014-12-17 17:40:56
@Inc-东莞
没错。如果像你那样写会更加好file:///C:\DOCUME~1\123\LOCALS~1\Temp\}$$SH8F5BOR8W96(N@`FVY4.gif
17:41:25
Tony--青 2014-12-17 17:41:25
曹健去改
鸿哥-深 2014-12-17 17:41:30
@Inc-东莞
等等。我也不赞成那样写
Inc-东 2014-12-17 17:41:31
如果采取你这种办法,延时不够,那么错误,如果延时太多,只会错等
Inc-东 2014-12-17 17:41:43
没人在工程这样写
Tony--青 2014-12-17 17:41:48
这种样式的延时很多地方都用
17:43:47
曹健-江苏 2014-12-17 17:43:47
等你们这些大神确定好了我再动手不迟
鸿哥-深 2014-12-17 17:43:53
@曹健-江苏
其实我还是坚持我那种写法,直接加delay,不要判断TI
石头--惠 2014-12-17 17:43:59
@Inc-东莞 “如果延时不够长,TI还没置位,表示发送还没完成,他就直接把TI清0,导致发送错误
”
石头--惠 2014-12-17 17:44:18
搞清楚,这个时候ES还没开了,是不会进串口中断的
石头--惠 2014-12-17 17:44:30
在这之前清串口标志TI是没问题的
曹健-江苏 2014-12-17 17:44:51
看到大家如此热烈的探讨单片机技术我很高兴好群好机油
Inc-东 2014-12-17 17:45:01
楼上也许没有注意延时下方的清-
Inc-东 2014-12-17 17:45:15
@鸿哥-深圳 这样写,我觉得是不可取的,但是你坚持,我也没办法
石头--惠 2014-12-17 17:45:23
清之前串口中断都没开
石头--惠 2014-12-17 17:45:27
没关系的
曹健-江苏 2014-12-17 17:45:40
今晚不搞程序了累了晚上和INC谈谈电源扯扯单片机
鸿哥-深 2014-12-17 17:45:41
@曹健-江苏
其实我还是坚持我那种写法,直接加delay,不要判断TI.
因为延时不够,发送会出错的,我们自然会调整延时。但是TI以满足就发送下一个字节,这样的数据发送很不稳定的,因为我以前遇到过。在51,PIC单片机上是会存在这种问题。而在stm32貌似不会这样。
石头--惠 2014-12-17 17:45:44
开了串口中断,这时候再发送缓存才会发出去
17:46:04
曹健-江苏 2014-12-17 17:46:04
鸿哥建议你整理这个帖子
17:46:03
石头--惠 2014-12-17 17:46:03
这个时候TI标志才会置位u
曹健-江苏 2014-12-17 17:46:14
帮助后来的群友
曹健-江苏 2014-12-17 17:46:24
因为我遇到这个问题别人也会遇到
鸿哥-深 2014-12-17 17:46:40
@曹健-江苏
这个我就不整理了。以前也有人问过。这个是经验,经验的东西是靠感觉的,说不清。
Inc-东 2014-12-17 17:46:52
@鸿哥-深圳 这样只会把串口拉慢了,效率低了,没有任何作用,串口本来就慢,在用定时器来保证你发送的数据的正确性已经足够
曹健-江苏 2014-12-17 17:47:04
而且强烈建议鸿哥将44和45例通过两个单片机测试一下
曹健-江苏 2014-12-17 17:47:07
我来整理
曹健-江苏 2014-12-17 17:47:11
鸿哥
Inc-东 2014-12-17 17:47:15
没错,也许你追求的是稳定性,在稳定性上面更加稳定一点
Inc-东 2014-12-17 17:47:20
但是,我说,没必要
曹健-江苏 2014-12-17 17:47:31
我日不能抬杠
曹健-江苏 2014-12-17 17:47:36
问题解决就行
曹健-江苏 2014-12-17 17:47:45
求同存异共同进步
鸿哥-深 2014-12-17 17:47:49
@Inc-东莞
如果你连续发送一串数据的时候,不加延时,很容易出错。今天曹健也是因为这个问题引起的。我以前也是因为这个问题在很多项目上遇到过。
Inc-东 2014-12-17 17:47:53
在我们采用校验,定时器检测,如果这样延时空等,这就浪费了CPU的效率
Inc-东 2014-12-17 17:48:32
采用了定时器检测,和接收校验,我可以说不会出现这种问题,采用FIFO接收,没有问题
Inc-东 2014-12-17 17:49:11
串口本来就是很慢的一个东西,太成熟了,是不会轻易出现这种问题的
Inc-东 2014-12-17 17:49:14
除非
Inc-东 2014-12-17 17:49:18
是接受的方式不对
鸿哥-深 2014-12-17 17:49:43
@Inc-东莞
这个跟FIFO和校验没关系。这个延时物理层面的延时。一旦因为这个延时导致数据发送不稳定,你会一直发送出错,不是偶尔的问题
页:
[1]