没有收到'>'在+ cmgs使用后

时间:2014-07-19 18:15:55

标签: avr at-command sim900

我正在使用SIM900 GSM模块连接到我的AVR微控制器。我的编译器是Code Vision AVR。 我想发送消息,我不想使用延迟。我使用usart rx中断。我想收到'>'在发送号码后的rx中断。然后发送我的meessage。 但是'>'没有收到charachter。我正在用一个' a'来检查这个过程。变量。首先' a'变量等于零,1分钟后等于2.但它永远不会等于3.结果我的消息没有被发送。我无法找到我的问题!

interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
  {
   rx_buffer[rx_wr_index++]=data;
     if(a==2)
        {
        if(data=='>')
            a=3;
        }
#if RX_BUFFER_SIZE == 256
 // special case for receiver buffer size=256
if (++rx_counter == 0)
  {
 #else
if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
   {
   rx_counter=0;
 #endif
   rx_buffer_overflow=1;
    }
   }
 }
void main()
{
//...rest of code
printf("at+cmgf=1%1c",enter);
printf("at+cmgda=%1c%s%1c%1c",q,del,q,enter);
while (1)
  {
//...rest of code
  RTC();

  if(minute!=1*count)
    flag1=0;
  if(minute==1*count && flag1!=1)
    {
    flag1=1;
    count++;
    a=1;
    }  


   if(a==1)
    {
    printf("at+cmgs=%1c%s%1c%1c",q,tel,q,enter);
    a=2;
    }

   if(a==3)
    {
    printf("Ba salam\rTemperature=%d\rHumidity=%d\rWind Direction=%s\rWind Speed=%d%1c%1c",temperature(),humidity(),direct1,anemometer(),cz,enter);
    a=0;
    }

  }

}

2 个答案:

答案 0 :(得分:0)

您似乎使用小写字母发送命令。用户手册指定大写字母,即AT而非at

循环顶部的分钟计数代码也有问题。 flag1将被设置回0,最终将a再次更改为1,这将导致再次发送消息。我不认为这是你的直接问题,但应该纠正。

我们也不知道该消息是否已通过SIM900。也许通过在终端上发送AT命令并检查返回值来尝试测试。 (例如,您的代码不会检查SIM900是否确认前两个命令。)

编辑: 仔细观察,我发现您的代码没有遵循手册中列出的发送文本的协议。这可能是因为手册有印刷错误。它有两个标记为"发送文本"的部分,但其中一个实际上是用于阅读文本。

您不需要包含AT+CMGDA=”DEL ALL”部分。这是在阅读文本的部分。此外,您”DEL ALL”拼写错误"DElALL"

更大的问题是将两个命令发送得如此接近会破坏返回码。

答案 1 :(得分:0)

您没有正确解析调制解调器的响应。

首先,永远不要将时间用作命令和响应的分隔符。您必须 读取解析从调制解调器收到的所有内容,直到您收到最终答复。绝对没有别的东西能可靠地运作。有关如何修复的一些提示,请参阅this answer

其次,对于AT+CMGS,您必须在发送数据之前等待四个字符\r\n>的序列。在上面的链接答案中也有关于此的提示。