摘要:
在Linux上使用不带GPRS协议栈的GSM模块,很容易会陷入僵局:无法使用pppd的同时又发送AT指令
给模块。此文从此角度出发,着手解决问题。
应用:
Modem--MCU使用PPP连接(DUP)发送数据编码。MCU需要频繁的检查模块的状态,包括:模块信号强度,检查短信和发送短信等等
常用解决办法
通常完成任务,需要使用以下技术:
1.当有数据需要传送时,建立PPP连接(DUN)。检测模块状态时,断开PPP连接,释放COM端口。在检测完模块状态以后,重新建立PPP连接,发送数据。
2.使用CMUX 串口复用,一路做PPP连接,一路输入at 指令。这需要在MCU和MODEM中加入CMUX协议。
第一种解决方法频繁的断开/连接将增大不稳定的可能性,通常DUN需要几秒时间才能正常连接。
Instead of requiring separate physical interfaces to manage different data communication technologies,
CMUX provides a virtualized communication interface. A virtual communication port consists of placing a layer of abstraction between hardware units and the software running on them, abstracting available system resources from a single physical unit and making it act as multiple, independent logical entities.
通过多路复用协议和GSM模组通讯,使得可以在通过GPRS拨号上网时可以同时拨打电话和收发短信。
伪终端的使用步骤如下所示。
int fdm fds;
char *slavename;
extern char *ptsname();
fdm = open("/dev/ptmx", O_RDWR); /*open master */
grantpt(fdm); /*change permission of slave */
unlockpt(fdm); /* unlock slave */
slavename = ptsname(fdm); /*get name of slave */
fds = open(slavename, O_RDWR); /*open slave */
ioctl(fds, I_PUSH, "ptem"); /* push ptem */
ioctl(fds, I_PUSH, "ldterm"); /* push ldterm */
通过函数open()打开设备“/dev/ptmx”,可以得到一对伪终端的主从设备,得到的fd是主设备的文件描述符,从设备的设备名可以通过函数ptsname()得到,用open()函数打开从设备名的设备,即可得到从设备的文件描述符。但此时从设备还不能打开,需要调用函数grantpt()接受从设备,修改从设备的访问权限,调用函数unlockpt()解锁从设备,才能够打开从设备。ptsname(),grantpt(),unlockpt()这几个函数的具体作用大家可以通过man命令查看。
具体的实现方法和代码可以参考如下的链接。
文件:gsmmux-alpha-2.rar
大小:201KB
下载:
下载
简单范例
文件:pty_exa.rar
大小:37KB
下载:
下载
参考文档:
1.伪终端驱动-ptm和pts,
2.多路复用协议的实现,
http://developer.berlios.de/projects/gsmmux/
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/90973/showart_1922193.html