主板上给模块发命令模块都可以正常接受,但是发短信的PDU数据时,模块只返回"OK\r\n",就是没返回"+CMGL: ",短信也发送不出去,里面的PDU编码是没问题的,我用串口调试助手把主板上发给短信模块的数据都接受下来,然后用串口调试助手发一模一样的命令和PDU数据给GSM模块,过一小会就返回"+CMGL: "接着是"OK\r\n",手机上可以接受短信也可以显示正确的数据。
就是高不明白同样的数据同样命令,为什么一个就能发送成功,一个就不行。在延时方面我也式过,给了也没有?
有谁遇到过这种问题没有?调一天了还是找不到原因。
cnt=gsmEncodePdu(&msg,buf,cnt);
i=(cnt>>1UL)-1;
sprintf(cbuf,"AT+CMGS=%d\r\n",((int) i)); //i是计算除了中心号码以外的数据字节数发送的
uartprintf("\n%s",cbuf);//串口调试助手查看命令内容
for(j=0;j<5;j++)
{
Modem_Tx_String(cbuf);//(cnt-2)/2
OSTimeDly(10); //200MS
ClearModemBuf(ModemRxBuf);
ReadModem(ModemRxBuf);
if (strstr(ModemRxBuf,"> ")==NULL) {uartprintf("\nCMGS:ERROR");return 0;}//是否有返回
else break;
}
strcat(buf,"\x1A");//插入接受标志
cnt++;
uartprintf("\n%s",buf);
uartprintf("\n%d",cnt);
ClearModemBuf(ModemRxBuf);
cnt=Modem_Tx_String(buf);//串口发送数据
for(j=0;j<20;j++)
{
OSTimeDly(OS_TICKS_PER_SEC);
ReadModem(ModemRxBuf);
if (ModemRxBuf[0]>0) {uartprintf("\n%s",ModemRxBuf);break;} //这里只返回一个"OK\r\n"
}
对主板发送给模块的数据为
AT+CMGS=142
0011000D91683124571689F50
000FF7FCC3A31ECD68140A099
6C4693CD68B2DA0C0492D1683
35A4C368BC540205A6C268BC9
6634990C0492CD6432DA6C468
BCD40A0194D368BC964321A0D
0492C56233596C5693C940A05
92C26ABD166311A0D0492C966
33DA6C169BCD40A0188D369BC
96632590C049AD162B3986C16
A3C9000000000000000000000
00000000000
0x1A//这里是16进制接受符合,上面的都是字符形式
我把这些数据在串口调试助手上发过去就可以正常发送
5 个解决方案
#1
这行写错了
0x1A//这里是16进制结束标志,上面的都是字符形式
在线等
0x1A//这里是16进制结束标志,上面的都是字符形式
在线等
#2
怎么没人来帮忙
#3
可能是你的buf字符串中没有0结尾所致!
代码修改如下:
int len;
strcat(buf,"\x1A");//插入接受标志
len=strlen(buf);
buf[len]=0;
cnt++;
uartprintf("\n%s",buf);
uartprintf("\n%d",cnt);
ClearModemBuf(ModemRxBuf);
cnt=Modem_Tx_String(buf);//串口发送数据
for(j=0;j<20;j++)
{
OSTimeDly(OS_TICKS_PER_SEC);
ReadModem(ModemRxBuf);
if (ModemRxBuf[0]>0) {uartprintf("\n%s",ModemRxBuf);break;} //这里只返回一个"OK\r\n"
}
代码修改如下:
int len;
strcat(buf,"\x1A");//插入接受标志
len=strlen(buf);
buf[len]=0;
cnt++;
uartprintf("\n%s",buf);
uartprintf("\n%d",cnt);
ClearModemBuf(ModemRxBuf);
cnt=Modem_Tx_String(buf);//串口发送数据
for(j=0;j<20;j++)
{
OSTimeDly(OS_TICKS_PER_SEC);
ReadModem(ModemRxBuf);
if (ModemRxBuf[0]>0) {uartprintf("\n%s",ModemRxBuf);break;} //这里只返回一个"OK\r\n"
}
#4
好像不是吧,我也不知道,不过现在已经解决了,分全部送给你哈哈,还是谢谢你?
#5
呵呵!不谢!
收了你的分子!
收了你的分子!
#1
这行写错了
0x1A//这里是16进制结束标志,上面的都是字符形式
在线等
0x1A//这里是16进制结束标志,上面的都是字符形式
在线等
#2
怎么没人来帮忙
#3
可能是你的buf字符串中没有0结尾所致!
代码修改如下:
int len;
strcat(buf,"\x1A");//插入接受标志
len=strlen(buf);
buf[len]=0;
cnt++;
uartprintf("\n%s",buf);
uartprintf("\n%d",cnt);
ClearModemBuf(ModemRxBuf);
cnt=Modem_Tx_String(buf);//串口发送数据
for(j=0;j<20;j++)
{
OSTimeDly(OS_TICKS_PER_SEC);
ReadModem(ModemRxBuf);
if (ModemRxBuf[0]>0) {uartprintf("\n%s",ModemRxBuf);break;} //这里只返回一个"OK\r\n"
}
代码修改如下:
int len;
strcat(buf,"\x1A");//插入接受标志
len=strlen(buf);
buf[len]=0;
cnt++;
uartprintf("\n%s",buf);
uartprintf("\n%d",cnt);
ClearModemBuf(ModemRxBuf);
cnt=Modem_Tx_String(buf);//串口发送数据
for(j=0;j<20;j++)
{
OSTimeDly(OS_TICKS_PER_SEC);
ReadModem(ModemRxBuf);
if (ModemRxBuf[0]>0) {uartprintf("\n%s",ModemRxBuf);break;} //这里只返回一个"OK\r\n"
}
#4
好像不是吧,我也不知道,不过现在已经解决了,分全部送给你哈哈,还是谢谢你?
#5
呵呵!不谢!
收了你的分子!
收了你的分子!