|
楼主 |
发表于 2009-1-3 15:38:01
|
显示全部楼层
回车就是十六进制0x0d
<Ctrl+Z>就是十六进制0x1a,用于结束PDU短信并且发送
<ESC>0x1b,用于取消PDU短信的输入
提前给你泄露一段代码,VC的,整个API函数还在测试,估计过两天就能放出来。
PurgeComm(hComm,PURGE_TXCLEAR|PURGE_RXCLEAR); //清收发缓存,防止干扰
sprintf(cmd, "AT+CMGS=%d\r", nPduLength / 2 - nSmscLength); // 生成命令
WriteComm(cmd, strlen(cmd)); // 先输出命令串
Sleep(20);
memset(ans, 0, 128);
nLength = ReadComm(ans, 128); // 读应答数据
// 根据能否找到"\r\n> "决定成功与否
if(strstr(ans, "\r\n>") != NULL)
{
bWaitingCommEvent = TRUE;
nLength = WriteComm(pdu, strlen(pdu)); // 得到肯定回答,继续输出PDU串,这个串的最后一个字符就是0x1a
ith = 6000;
//使用非重叠IO,WaitCommEvent函数会阻塞,而在阻塞前创建一个线程,线程负责超时,一旦超时,强制结束WaitCommEvent阻塞
thHandle = ::CreateThread(NULL, 0, thcommtimeout, &ith, 0, &dwthread);
SetCommMask(hComm, EV_RXCHAR); //设定串口事件
icommevent = 0;
WaitCommEvent(hComm, &icommevent, 0); //开始阻塞等待
//清除串口事件
SetCommMask(hComm, 0); //清除串口事件
//看看串口接收了多少字节数据
ClearCommError(hComm,&dwErrorFlags,&ComStat);
dwBytesRead=min(128, ComStat.cbInQue);
bWaitingCommEvent = FALSE;
Sleep(10);
memset(ans, 0, 128);
ReadComm(ans, dwBytesRead);
CloseHandle(thHandle);
if (strstr(ans, "+CMGS:") != NULL) //发送成功标志,返回短信长度
{
return nLength;
}
if (strstr(ans, "ERROR") != NULL) //返回发送失败标志,具体错误号还没来得及处理,暂时返回0
{
return 0;
}
}
WriteComm("\x1b", 1); //如果半途出错,送<ESC>,省得模块在PDU输入状态死等 |
|