其他分享
首页 > 其他分享> > uartlite 双工时发数错误

uartlite 双工时发数错误

作者:互联网

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);

        

标签:发数,字节,发送,pc,测试,linux,uartlite,工时
来源: https://blog.csdn.net/fzktongyong/article/details/118344112