little4_su 发表于 2016-12-7 15:50:08

如何让双串口可靠的收发信息?

        串口0和串口1的协议都是ModBus,如果另个串口都结了主站,那么问题就出现了,两个主站会时不时的失去联系,但能恢复,或者通讯极为不缓慢,响应很不及时,总之很不理想。如果只接有一个主站,以上问题不会出现,通讯很正常。我现在的处理是,进入UART0接收中断服务时禁止UART1接收中断,然后处理文笔UART0来的数据帧后再开UART1的中断;同理,进入UART1接收中断服务时禁止UART0接收中断,然后处理文笔UART1来的数据帧后再开UART0的中断。但这样处理还是不近人意,不知道大家做这种双串口从站的通讯是如何处理的?

flamma 发表于 2016-12-7 16:49:13

说明你关中断的时间太长了。一般使用一个ringbuf来保存串口数据,中断只把数据写入就结束。然后用专门的处理线程从ringbuf里面读数据然后处理协议。

ilikemcu 发表于 2016-12-7 16:53:21

古二真。

不管什么芯片,进中断后,在中断里处理事务一定要简明扼要,把必须紧急处理的做好,其余的事情等出了中断,按照中断里做的标记,一个个判别去处理,如果都放在中断里完成,STM32这种速度的芯片也多半会自己内部先打起来。

little4_su 发表于 2016-12-8 09:50:45

ilikemcu 发表于 2016-12-7 16:53
古二真。

不管什么芯片,进中断后,在中断里处理事务一定要简明扼要,把必须紧急处理的做好,其余的事情等 ...

之前单串口时,是把处理数据帧的函数放在main函数中的,但是处理稍微滞后了些,后来就把它移到中断里,响应上位机的速度确实快了很多。后来变成双串口后,两个还是放在中断里,情况变得糟糕。现在你点醒了我,我把他们全都放到main来了,同时也不再两个串口互相禁止彼此接收和中断,由着他们来。另外之前对4个18b20、16个NTC的每10个数组的采样改为了每100ms单次采样一次,情况得到了大大的改善。上位机不再出现令人讨厌的“PLC no response”的字样(我是用另个威纶通的触屏作为上位机的)。再次感谢你!

lcw_swust 发表于 2016-12-8 21:39:04

软件模拟两个FIFO,接收中断往里写,主循环去读取.

lingdianhao 发表于 2016-12-8 22:33:44

两个串口STM32跑不过来,开玩笑吧!随便跑吧。

wanggoals 发表于 2016-12-8 22:53:45

按照你的编程习惯,建议你把主芯片换成带硬件的FIFO的芯片
页: [1]
查看完整版本: 如何让双串口可靠的收发信息?