最近在做手机MMI的封装,要将其移植到linux上。我们使用的手机GSM模组是USB接口的,而一般的模组是基于串口来通讯的,一时不知道如何和手机连接。于是花了点时间研究了下实现的方法,发现并不难于实现。在此作些记录以作备忘。
-
USB接口的实质
通过在windows中的测试和使用,发现手机GSM模组的USB接口在PC端是以虚拟串口的形式存在的,PC端的程序要和模组通讯,实际上是操作这个虚拟串口。在windows中,将会在设备管理器中多出一个调制解调器设备,调制解调器设备的属性项下可以看到其使用的串口,通过该串口即可以和手机通讯。在linux中,只要有usbcore和usbserial,加上pl2303芯片的驱动,在/dev目录下就会出现一个ttyUSB0的设备,操作该tty设备即可以和手机通讯。实际上windows和linux都是使用pl2303的驱动程序。
手机USB接口的驱动程序栈如下所示。
pl2303驱动 |
usbserial驱动 |
usbcore驱动
|
-
使用终端和手机进行会话
在windows上,通过超级终端连接到手机的虚拟串口或调制解调器,一般是COM3到COM15,就可以和手机建立会话,使用AT命令和手机交互,如拨打电话,收发短信等。
在linux上,使用Linux下的串口终端程序minicom,连接到设备ttyUSB0,按8N1的串口标准设置,选择合适的波特率(如115200bps),就可以和手机建立会话,使用AT命令操作手机。
-
在C程序中和手机通讯
在windows上,使用windows的API函数CreateFile打开手机的虚拟串口,用API 函数WriteFile发送AT命令字符串,用API函数ReadFile读取AT命令的响应。
在linux上,使用一般的打开文件的API函数open打开ttyUSB0设备,设置好该终端设备的属性,用API函数write发送AT命令字符串,用API函数read读取AT命 令的响应,也可以使用select函数挂起在该串口设备上。Linux的串口通讯程序的编写可以参考我的上一篇文章《怎样控制一个串行口和调制解调器》或Linux Serial Programming HOWTO - 串口通讯编程。