Java教程

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

        

这篇关于uartlite 双工时发数错误的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!