- 论坛徽章:
- 0
|
我用一块AM1808的开发板,它有两个USB控制器,一个是host,一个是OTG(2.0 full speed/high speed)。现在我将OTG配置成了ACM CDC Serial Gadget设备,没有修改任何驱动代码,然后编译烧写,并自己写了测试程序进行测试,有几个问题百思不得其解,求大家帮助。
1.开发板内核版本为2.6.30,在开发板上配置好ACM CDC Serial Gadget后,在开发板上可以看到 /dev/ttyGS0。
2.用usb线连接开发板和PC,PC是ubuntu系统,内核版本为2.6.28。PC上可以枚举到开发板,/dev/ttyACM0。
3.在PC上用lsusb -v命令查看,一切看上去正常。
我写了两个串口测试程序,一个专门用于发送,一个专门用于接收。发送程序是根据一个输入参数,循环地向另一端的usb串口设备发送数据,每次发送数据为1k,循环发送的次数等于这个输入参数。接收程序也和发送程序一样,不断地循环接收1k数据。
根据我测试的结果,发现了一些奇怪的问题,求大家解答:
1.发送和接收程序都设置了波特率,但根据测试结果,波特率设置并不起作用,有同学能回答一下吗?
2.开发板向PC发送数据,无论发送程序循环发送多大的数据,PC端都能接收到。
3.反过来,PC向开发板发送数据,如果循环次数小于等于4,也就是发送4k及以下数据,开发板都能接收,并且数据是正确的。
4.如果PC向开发板发送数据大于4k,开发板却只能接收到一半的数据,但PC端的发送程序却已经结束了,并且发送过程中,write函数没有报任何错。由于接收程序需要接收和发送程序发送同样大小的数据,它在读取一半的数据后就阻塞在那,如果此时在PC端再次运行发送程序,开发板上的接收程序能读取到上次没有接收到的另一半数据,此现象太奇怪了,希望大家帮忙分析一下!!!!
5.前面提到过,开发板向PC发送数据,不论数据大小,PC都能接收到,但如果发送的数据小于256M,每次发送和接收的数据都完全一致。如果发送数据大于512M,发送和接收的数据会出现不一致的情况,频率接近1/2。这个现象也很奇怪,难不成让usb一直发送会提高误码率???
6.另一个现象也非常奇怪,如果开发板和PC只发送而另一端却不开接收程序,发送数据大小为4k时,发送程序会返回,并且write函数不报任何错误,发送数据大小大于4k时,如果另一端不开接收程序,发送程序不会返回,会阻塞住。也请大家分析一下这个问题呢,莫非每次write函数调用,只是在将数据拷贝到内核后,就返回了,而并不等待硬件操作结束。而我在发送4k过程中,由于对端并没有接收程序,会让usb停止,导致buffer中的数据没有送出,而后续的write系统调用因为buffer满了而被阻塞???
不晓得其他同学们遇到和我类似的问题没有,希望大家都帮忙分析一下,我现在对这些问题都已经两眼一抹黑,抓瞎了,都不晓得怎么解决,甚至我想到修改开发板,因为我主观地认为开发板的usb与PC不匹配,让USB工作在full speed模式下,但到代码里面去看了一下,却发现改full speed模式好像还没那么简单。而且如果开发板usb和PC不匹配的话,那它们之间互相发送4k大小的数据完全没有问题,这好像又解释不同。
|
|