1、测试环境
跑linux;
使用uartlite,波特率设置为230400;
发送端按32字节,间隔20ms循环发送,pc接收;
接收端,pc发送按256字节,间隔20ms;
连续测试,pc接收1万包,32万字节。
2、问题和现象
当双向工作时,pc接收到的数据有百分之2的误包率,错误方式很规则,都是第二字节和第一字节相同;
当pc不发送时,连续测试无丢包,无错字节。
3、分析过程
裸跑测试发现双工测试无错字节;
使用ps的串口,按相同方法测试,也没问题;
使用uartlite,波特率降低到115200(pc发送的256字节降低到64字节),误包率降低到万分之5,有明显的降低;
开始怀疑uartlite的驱动,查看kernel源码,在文件“linux-xlnx/drivers/tty/serial/uartlite.c”中,监控发送函数“ulite_transmit”,其中的“uart_out32”中发现了数据错误;
后参考“https://github.com/Xilinx/linux-xlnx/blame/master/drivers/tty/serial/uartlite.c”,在中断中加自旋锁,测试正常。
4、解决方法
在中断函数中加入自旋锁spin_lock_irqsave(&port->lock, flags);spin_unlock_irqrestore(&port->lock, flags);