AT指令操作短信猫——碰到的问题及解决方法

一个急需的demo,赶在老外来看产品之前弄出来。

使用的万象的短信猫,说实话,sdk做的真垃圾……,本来对于我们的应用,调一下它的sdk发发短信,然后调用接收短信接口把短信内容拿下来就OK了,一共不过5、6个函数,却发现发出短信后,怎么也收不到我的现场设备的短信回复,如果勾选要求回执,则只能收到回执,收不到短信,用超级终端登录,发送AT+CMGL=”ALL”却能把所有短信都列出来——实际上短信猫已经收到回复的短信,sdk就是读不出来。后来居然每次点击接收短信按钮,demo就挂了,超级终端查看,无法连接,发任何指令,只是返回“+CME ERROR: 515”,网上搜罗半天,发现如下解释:

发送短消息后,收到出错信息+CMS ERROR 515

如果您的GSM MODEM在初始化期间或在指令执行过程当中GSM MODEM又接受新的指令,将会出现此错误。您必须等到初始化完成或指令执行完毕。

出现这样的问题,我可以负责任的说,sdk根本就没有做访问控制,导致指令操作上的重叠!

无语,sdk做的太烂,只能在跟他们沟通查找原因和跟换设备(据他们技术说是设备问题,所以可以更换另一个系列的设备来看看)的同时相向别的办法,比如避开sdk,直接用AT指令操作。

碰到的第一个问题是:

现在的计算机本身已经很少带COM口的了,大部分的串口设备只能通过串口转USB,然后由USB串口转换器的驱动模拟COM口,这样一来又增加了一个风险:很多USB转串口实际上也很不稳定,这也是最初选短信猫时想选usb系列而不是串口系列的原因,但是据销售商说他们的串口猫比usb猫更稳定,我倒…,最后经理还是拍板买串口系列的,用我们的串口-usb-串口做转换。

不知道为什么,打开系统自带的COM1没问题,但是打开usb转换的串口COM15却怎么也打不开,Open的时候报错:找不到指定的文件(因为windows下面都是通过WriteFile()/ReadFile()把串口当做文件来读写的),我是这样操作的:

[code lang=”c”]
bool CComm::Init(char* comm, unsigned int baudRate)
{
if(isOpen) return true;

char tmp[100];
memset(tmp, 0, sizeof(tmp));
sprintf(tmp, "%s", comm);

hCom=CreateFile(tmp,//COM1口
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
if(hCom==(HANDLE)-1)
{
getMsg("打开串口失败!");
return false;
}

isOpen = true;
// ……
// ……
// ……

[/code]

外面传递进来的char* comm字符串一般都是”COM1″、”COM2″、”COM15″、之类的字符串,但是sub转串口模拟出来的COM口却打不开,需要用如下格式:

[code lang=”c”]
char tmp[100];
memset(tmp, 0, sizeof(tmp));
sprintf(tmp, "\\\\.\\%s", comm);
[/code]

第二个问题:

串口是慢速设备,一定要在给它发完内容后用sleep停顿一下(300~10000毫秒不等),让它把内容往串口上把内容写完在继续下一步操作。

这里需要特别注意的是,短信内容其实还是很多的,如果里面有上百条未读短信,那么可能会有几十k的字节,这样的话串口输出会很慢,如果你只是等了不到一秒或者几秒,可能都还不够,如果这时候继续对短信猫发送操作指令,那么很有可能出现上面所说的515错误,出现这样的问题,你只能重新启动短信猫了,据我估计,这也是上面所说的sdk导致的问题所在。

其实针对这个问题,用sleep是一个很笨重的办法,负责任的做法应该是异步访问串口,将数据读完后自然返回EOF标示。

AT指令操作短信猫——碰到的问题及解决方法》有24个想法

发表评论

电子邮件地址不会被公开。