Я пишу код C для получения батареи с помощью GSM-модема SIM 800E. Я использую AtMega16 uC. Здесь я использовал AT-команды для получения информации о батарее.
void uart_send(unsigned char ch) //Function to send via UART
{
while(!(UCSRA &(1<<UDRE)));
UDR=ch;
}
void bat() //Function to get battery info and send SMS via UART
{
int x;
char battery[16];
UCSRB &= ~(1<<UDRIE);
writecommand("AT+CBC"); //AT command to get battery status(My program stuck here)
for(int x = 0;x<20;x++) //Reading 20 characters by the response of AT+CBS
{
while(!(UCSRA & (1<<RXC)));
battery[x] = UDR;
}
UCSRB |= (1<<RXCIE);
for(int x=1;x<20;x++) //sending 20 characters to UART
{
uart_send(*battery);
}
}
int main()
{
DDRB=0xff; //PORT as output port for LCD
uart_init(); //initializing UART
_delay_ms(1000);
writecommand("AT");
writecommand("AT+CMGF=1"); //setting GSM to Text Mode
writecommand("AT+CNMI=2,0,2,0,0");
while(1)
{
bat();
transmit("AT+CMGS=\"+9195xxxxxxxx\"\r"); //Sending SMS with values in UART buffer
_delay_ms(10);
uart_send(26); // command to send SMS
}
Когда я запускаю код, он застревает в функции bat () (в «AT + CBC»), он отображает информацию о батарее на ЖК-дисплее и терминале, но не отправляет ее по смс, и программа не продолжается дальше. Подскажите, пожалуйста, как получить информацию через смс.
Редактировать
Относительно комментариев Loongcat
Я получаю 20 символов после команды «AT + CBC», тогда он должен это получить. это петляfor(int x = 0;x<20;x++)
1) AT+CMGS должен идти перед телом смс (поместите bat() после передачи())
2) Вы не определяете конец ответа на команду AT+CBC, это плохой способ. Вы должны получать символы, пока не получите «ОК».
AT+CMGS
затем сообщение AT+CBC
, отправка сообщения может быть прервана из-за новой AT-команды.Я вижу следующие проблемы в вашем коде:
bat()
функции вы сохраняете информацию о батарее в локальной строке ( char battery[16];
)
for(int x = 0;x<20;x++)
Если вы ожидаете 20 символов, вы должны использовать массив размером 20 + 1 плюс один для завершающего нулевого символа: \0
.uart_send
функция ожидает unsigned char
в качестве параметра, поэтому этот вызов неверен: uart_send(*battery);
он должен бытьuart_send(battery[x]);
В текущем состоянии вашей программы не будет никаких проблем, так как вы передаете эту строку в функции bat()
, но вы должны передавать ее после AT+CMGS
команды, где эта строка не будет доступна.
Если просто вызывать bat()
функцию после AT+CMGS
, это вызовет проблемы, потому что AT+CBC
команда будет отправлена в модуль, который за нее будет отвечать. Я думаю, что это прервет выполнение команды AT+CMGS
.
Поэтому я предлагаю вам сначала сохранить информацию о батарее в переменную, которая не потеряется, и отправить ее в нужное время. Правильная последовательность отправки сообщения должна выглядеть примерно так:
AT+CMGS="+9195xxxxxxxx"
команду.>
, это означает, что модуль обработал номер телефона и теперь готов принять тело SMS, [информация о батарее].>
персонажа, вы можете отправить информацию о батарее в модуль.<CTRL>-<Z>
, используя символ 0x26
в ASCII.+CMGS: 62
Бенс Кауликс
Рави Кумар