本文主要是介绍SYD8811串口全双工自动回传测试问题和解决办法[卡死在发送函数的while中],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
原来串口中断的写法如下:
这里接收到数据的时候填充进buff中:
然后主循环中发送出去:
现在测试到上面的代码一段时间后就不会自动回复了:
现在修改中断的逻辑如下:
这时候长时间测试串口都是有回复的,所以一定要先读数据再清除标志位!
本文源码请从如下地址下载:https://download.csdn.net/download/chengdong1314/87105011
卡死在发送函数的while中
经过上面的修改依旧会存在长时间老化测试卡死在发送函数的while中,这个现象应该是硬件在某种是否不会设置TI标志位,造成软件卡死
void uart_1_write(uint8_t data)
{UART_1_CTRL->TX_DATA = data;while(UART_1_CTRL->TI == 0);UART_1_CTRL->TI = 0;
}
按照如下方式增加超时发送自动退出的功能:
void uart_1_write(uint8_t data)
{uint32_t j=0x10000;UART_1_CTRL->TX_DATA = data;//while(UART_1_CTRL->TI == 0);while((UART_1_CTRL->TI == 0) && j) j--;UART_1_CTRL->TI = 0;
}
由于不是硬件设置的标志位,所以担心会造成数据丢失,所以这里做了这样的老化测试,定时100MS串口发送一个数据给SYD8811然后SYD8811把数据原封不动的返回.经过一个晚上,65万个数据包的交互,可以判断如上面加超时推出的方式并不会影响数据的发送,也就是说硬件已经发送出去了但是没有回来设置标志位:
代码和数据请看如下资源(串口数据:老化测试一晚上2022_11_23_13-03-40.DAT):https://download.csdn.net/download/chengdong1314/87141120
这篇关于SYD8811串口全双工自动回传测试问题和解决办法[卡死在发送函数的while中]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!