Android下模拟器使用串口进行通讯

由于最近在弄Android串口通讯相关工作,在源码开发模拟下写了个串口通讯程序,首先在Ubutu下使用GCC编译,并且在Linux下与另一台PC的串口工具进行串口通讯测试,一切OK,于是,接着移植到Android环境下,制作了一个Android.mk文件后,使用mmm编译,make snod打包进system.img镜像文件, 然后使用模拟器启动,emulator&, 接着adb shell连接,进入到自己的程序目录,启动程序,发现串口不能正常通讯。为什么? 分析原因。。。我的模拟器的是ubuntu下跑的,串口使用的是usb转串口,在ubuntu下对应 的设备是/dev/ttyUSB0,并且这个已经在ubuntu下测试通过,一切OK了, 那为什么在Android下就不行了呢?

百度了一下,原本需要使用qemu重定向串口, 于是关闭模拟器,使用指令emulator -qemu -serial /dev/USB0 &重新启动模拟器,这样就将模拟器下的/dev/ttyS2重定向到Ubuntu下的/dev/ttyUSB0了,这样就可以在Android模拟器通过使用/dev/ttyS2这个设备来操作串口了! (当然对应的串口程序也进行相应的修改). 至于为什么是/dev/ttyS2,而不是/dev/ttyS0或ttyS2呢? who knows? 估计是Android模拟器就是这么规定了,管那么多干嘛,知道操作ttyS2照做就是!

万事俱备,只欠测试通过了。。。adb shell再次连接上模拟器。启动串口程序...模拟器发送数据,另一台PC机上能正常接收到! 看来没错,就是这样了,启动模拟器需要重定向串口!

接下来测试串口接收。。通过另一台PC上的串口工具向模拟器发送数据。没反应!why?

采用扫除法:

1:既然在模拟器内能通过/dev/ttyS2发送数据,说明就是这个串口设备没错.

2:既然都能在Ubuntu下通讯正常,收发一切OK,那就说明接收源代码也应该没有问题(Android采用linux内核,对串口的操作跟在Ubuntu下通过代码操作串口没什么区别.)

3:既然串口没错,代码也没有错,那么唯一可能的原因就是运行环境了。。。莫非是模拟器的原因?!


在adb shell 内结束掉正在运行的串口程序,尝试一下echo "11111111">/dev/ttyS2 ...意料之中,另一台PC能正确收到串口数据。模拟器串口发送数据没有问题,OK。然后通过另一台PC向模拟器发送数据,模拟器终端居然能正常显示接收到的串口数据?!! 这不说明在模拟器的环境下也能接收数据吗?那为什么模拟器下串口程序就接收不到?

退出模拟器,再次重复上述操作,启动模拟器,adb shell连接模拟器,这次什么也没操作,直接通过另一台PC机向模拟发送数据,结果终端没任何显示。再次echo "11111111">/dev/ttyS2,另一台PC能接收到数据,再次通过那台PC回发数据,居然接收不到,看来模拟器在串口接收数据这方面很怪异呀。莫非终端tty驱动在读取串口方面本身存在问题?

你可能感兴趣的:(Android下模拟器使用串口进行通讯)