开发环境为Linux+Qt, 功能是实现tcp 、udp发送消息,检测U盘插拔、同时在arm端移植syszuxpinyin软键盘出入法。 下面是我当时的工作总结。下面是效果图:
关于tcp、udp:
工作 状况 和 总结
|
工作状况: 1, 调通了 Qt 下的 TCP 通信模块,并在板子上测试通过, A8 开发板与 PC 通信良好,发送中文无乱码。 2, 将 TCP 模块和 UDP 模块整合到一起,做到一个 GUI 界面里。由于 TCP 的服务端和客户端是不同的,所以合到一起后代码分两份。 3, 解决 Tiny210 开发板上没有键盘的情况下不能输入的问题,尤其是不能输入中文。移植并改进了 SYSZUXpinyin 输入法,在 Qt 的程序里能正常调出软键盘,利用软键盘输入中文。由于 SYSZUXpinyin 的文字编码方式是 GB2312 ,而 linux 下 qt 默认的正常显示中文编码方式是 UTF-8 ,为了解决两者之间的冲突,费了一些功夫。最终顺利解决,发送和接收都能正常显示中文。 4, 利用 Qt 检测 U 盘的插拔情况。具体用到了 Qt 的 dbus 模块。在 PC 上已经初步检测成功,但移植到 arm 时发现默认的编译 Qt 时是不带 dbus 模块的。现在需要重新编译带 dbus 模块的 arm 版 Qt 。在编译时发现需要先安装 dbus 库。 总结: 1, 移植输入法后,由于既要解决 GB2312 和 UTF-8 编码的矛盾,又要解决 UDP 、 TCP 通信模块在对端收到文字时能正常解析,让我费了不少事。这方便网上资料基本没有,最后通过看 qt 自带的帮助文档参考众多资料,才得以解决。 2, 利用 Qt 检测 U 盘的插拔,通过研究发现,在 linux 下 U 盘插进去后会注册大约 7 个 usb-device ,只里面只有最后一个是真正的 USB 存储设备。也只有真正的 USB 存储设备注册成功后,用户才可以正常读写 U 盘。 |
关于检测U盘:
工作 状况 和 总结
|
工作状况: 1, 在 PC 机 x86 平台下,实现了基于 HAL 机制和 UDISKS 机制的 qdbus 检测 U 盘插拔的设计,在 pc 平台下能正常检测 U 盘插拔。 2, 在将以上两种方法移植到 arm 平台时,发现 arm 平台并不支持 HAL 和 UDISKS 。原因是 HAL 和 UDISKS 机制都是接收的 udev 的消息,而 udev 需要 sysfs 文件系统做支持,而现在的嵌入式文件系统大多数为 yaffs 系统。 3, 基于以上种种问题,最终选择了内核的 hotplug 机制, hotplug 接收内核的消息。当有 U 盘插入或拔出时会有消息从内核发出。利用这些消息发出的关键字如“ add ”和“ remove ”可以检测 U 盘的插拔,及整个内核识别 usb 的过程。 4, 考虑到当用户还在 U 盘目录的下拔出 U 盘,此后若不重启开发板就会识别异常。在未重启开发板前,希望程序对 U 盘的这种情况进行检测并提醒用户。试验了很多种方法,最终采用了往 U 盘内写测试文件,来检验 U 盘是否真正识别。 总结:经过仔细研究发现,当用户还在 U 盘目录下直接拔出 U 盘, linux 系统还来不及对 U 盘原挂载目录 /udisk 进行卸载,因此当未重启再次插入 U 盘, U 盘依旧要访问申请挂载到 /udisk 就会出错。这种状况除了往 /udisk 里写数据进行测试外,很难检测。因此,不妨在检测拔出 U 盘时,判断 /udisk 目录是否存在,如果存在则执行 umount /udisk ,这样再次插入 U 盘就能正常访问。 |
代码分为服务器端和客户端,每个端都有x86版本和编译好的arm版本,共4份源码,供大家参考。
下面是说明:
Esto-client-arm.tar ----------交叉编译后arm版本的客户端程序,实现功能有:udp传输、tcp传输、U盘监测,交叉编译器为arm-linux-gcc-4.5.1
Esto-server-arm.tar ----------交叉编译后arm版本的服务器端程序,实现功能有:udp传输、tcp传输、软键盘移植
Esto-client-x86.tar ----------PC机上,客户端程序,实现功能有:udp传输、tcp传输、u盘监测
Esto-server-x86.tar ----------PC机上,服务器端程序,实现功能有:udp传输、tcp传输
备注:SYSZUXpinyin只能在arm上编译,无法再x86上编译运行,原因是其实现基于QWSInputMethod,这个类是arm版本的库所特有的。
客户端的两份源码: http://www.pudn.com/downloads529/sourcecode/embedded/detail2190912.html
服务器端的两份源码: http://www.pudn.com/downloads529/sourcecode/embedded/detail2190909.html