在嵌入式系统上开发短信模块Tc35i时出现超级古怪问题??????

时间:2022-11-14 20:17:01
问题如下:
主板上给模块发命令模块都可以正常接受,但是发短信的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进制结束标志,上面的都是字符形式 

在线等

#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"
            
    }

#4


好像不是吧,我也不知道,不过现在已经解决了,分全部送给你哈哈,还是谢谢你?

#5


呵呵!不谢!
收了你的分子!

#1


这行写错了
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"
            
    }

#4


好像不是吧,我也不知道,不过现在已经解决了,分全部送给你哈哈,还是谢谢你?

#5


呵呵!不谢!
收了你的分子!