我正在使用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;
}
}
}
答案 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>
的序列。在上面的链接答案中也有关于此的提示。