0

我正在使用 SIM900 GSM 模块连接到我的 AVR 微控制器。我的编译器是 Code Vision AVR。我想发送一条消息,我不想使用延迟。我使用 usart rx 中断。我想在发送号码后在 rx 中断中接收“>”。然后发送我的消息。但是没有收到'>'字符。我正在使用“a”变量检查此过程。首先,“a”变量等于 0,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;
    }

  }

}

4

2 回答 2

0

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

首先,永远,永远,永远,用时间作为命令和响应的分隔符。您必须 读取解析从调制解调器收到的所有内容,直到您得到最终响应。绝对没有其他东西可以可靠地工作。有关如何修复的一些提示,请参阅此答案。

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

于 2014-07-23T00:11:09.383 回答
0
于 2014-07-21T22:41:57.240 回答