如您所说,如果有一个指令可以被响应,那说明硬件接口并无问题。单片机和计算机串口能够正常通信,GSM和计算机串口也能够正常通信,这不也能说明硬件接口无问题吗。
程序上我实在是很难找到单独的程序错误了……单片机发送的AT指令我都是用串口调试助手在电脑上正确测试,然后平搬过来的;并且读下GSM的正确返回信息,写在程序里让单片机验证的。
刚才绕开232的我大概没做好,我只把单片机上的max232卸下来了却没把GSM上的232焊下来,这大概会导致其无法收或者发信息。但是我想232能和计算机通信的这么好,让这两个模块相互通信这应该也不会有什么问题把。还有我买GSM的商家告诉我直接TTL电平引脚调试易烧坏tc35芯片~,所以我就没有再做进一步的测试了。
void SIMInit(void)
{
//ReadBPB();//
while(!SYSSTART)
{
if(ReceiveBuffer[count-1]=='\n' &&
ReceiveBuffer[count-2]=='\r' &&
ReceiveBuffer[count-3]=='T' &&
ReceiveBuffer[count-4]=='R' &&
ReceiveBuffer[count-5]=='A' &&
ReceiveBuffer[count-6]=='T' &&
ReceiveBuffer[count-7]=='S' &&
ReceiveBuffer[count-8]=='S' &&
ReceiveBuffer[count-9]=='Y' &&
ReceiveBuffer[count-10]=='S' )
{
SYSSTART=1;
count=0;
memset(ReceiveBuffer,'\0',250);
}
}
uartPutStr(AT_cmd); //发送握手信号
while(!isOK)
{
if(ReceiveBuffer[count-1]=='\n' &&
ReceiveBuffer[count-2]=='\r' &&
ReceiveBuffer[count-3]=='K' &&
ReceiveBuffer[count-4]=='O' ) //验证返回信号是否为"OK"
{
isOK=1;
count=0;
memset(ReceiveBuffer,'\0',512); //再次验证返回信号是否为"OK"
}
}
isOK=0;
uartPutStr(ATE_cmd); //发送简化显示要求信号
while(!isOK)
{
if(ReceiveBuffer[count-1]=='\n' &&
ReceiveBuffer[count-2]=='\r' &&
ReceiveBuffer[count-3]=='K' &&
ReceiveBuffer[count-4]=='O' )
{
isOK=1;
count=0;
memset(ReceiveBuffer,'\0',512);
}
}
isOK=0;
uartPutStr(CNMI_cmd);
while(!isOK)
{
if(ReceiveBuffer[count-1]=='\n' &&
ReceiveBuffer[count-2]=='\r' &&
ReceiveBuffer[count-3]=='K' &&
ReceiveBuffer[count-4]=='O' )
{
isOK=1;
count=0;
memset(ReceiveBuffer,'\0',512);
}
}
isOK=0;
}
上面这个是我的初始化函数,然后就发现也是连接GSM到单片机的时候,单片机也是完全无法通过这个初始化的。这是我下午改了之后的。我之前没有准却判断GSM返回信息是否为“OK”之类的准确字符,而是直接判断其返回几个字符,比如:
uartPutStr(AT_cmd); //发送握手信号
while(!isOK)
{
if(strlen(ReceiveBuffer)==9) //验证返回信号是否为"OK"
{
delay(10); //延时消除误差
if(strlen(ReceiveBuffer)==9)
isOK=1;
count=0;
//OperateFile2(1 ,"TTTTTTTTTXT", 512, 512, ReceiveBuffer);
memset(ReceiveBuffer,'\0',512); //再次验证返回信号是否为"OK"
}
}
如此设置,单片机往往能够通过这个初始化函数而进入主函数。
之前我也在电脑上分别模拟GSM和单片机 对单片机和GSM发送返回信息或者指令,来调试,都没问题,二者一连起来使用,就不行了。
这使我非常困惑,不知问题出在哪。
|