由于最近在弄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驱动在读取串口方面本身存在问题?

更多相关文章

  1. Android(安卓)camera 默认显示黑白的问题
  2. Android基本之SharedPreferences和File
  3. 第一行代码 Android读书笔记(四)
  4. Android如何在测试程序中删除被测应用私有的原始数据
  5. Android(安卓)ListView理解之BaseAdapter
  6. 小记Activity生命周期(onCreate)
  7. android桌面小部件appwidget使用ListView或者StackView如何刷新
  8. android sharedpreference保存boolean,int,float,long,String和图片
  9. 【Android】网络通讯

随机推荐

  1. PHP实现发送邮件实例
  2. offset 的用法
  3. 如何画动漫人物的五官比例?动漫人物五官教
  4. php修改word的实例方法
  5. 系统学习 TypeScript(五)——联合类型
  6. PHP获取学生成绩的方法
  7. 如何解决php-fpm启动不了问题
  8. 初学者素描漫画怎么入门?素描漫画入门初学
  9. 意派Epub360丨如何制作长页面新闻宣传报
  10. 关于PHP数组迭代器的使用方法实例