Как из буфера считать и сохранить данные в сроку? Требуется сохранить EMEI GPRS модуля.

VS_Viktor
Offline
Зарегистрирован: 27.02.2018

приветствую,

прошу помощи с кодом чтения и сохранения данных (ответ AT-команды) из порта.

С помощью AT-команды (AT+GSN) запрашиваю EMEI-код GPRS-шилда (он на Serial2). Не могу понять как его (EMEI) в цикле считать массивом в строку. И какой порт считывать - Serial или Serial2.

Полученный номер не повторяет EMEI и больше чем в два раза.

b707
Offline
Зарегистрирован: 26.05.2017

Считывание ответа от модема ничем не отличается от любого другого получения данных по Сериал. Считывать надо из того порта, к которому подключен модем, конечно же...

Если хотите разобраться,  почему считывается с ошибкой - выкладывайте код.

VS_Viktor
Offline
Зарегистрирован: 27.02.2018
Serial.println("Get IMEI...");
Serial2.println("AT+GSN");
delay(2000);
while(Serial2.available()>0) {
       atreplychar = Serial2.read();
       IMEI.concat(atreplychar);
       Serial.print(atreplychar);}
Serial.println("IMEI=" + String(IMEI));
delay(2000);

старый код уже убил. постарался написать новый, но он получилось хуже - он ловит то, что улетает в модем. выводит IMEI=AT+GSN

:-(

VS_Viktor
Offline
Зарегистрирован: 27.02.2018
s8 GSMClass::GetIMEI (char* IMEIbuf)
{
 GSM.WriteStr_P(PSTR("AT\r\n"));
 _delay_ms(500);
 UART0_rx_reset( );  
 UART0_setSearchString( OK_ );
 GSM.WriteStr_P(PSTR("\r\nAT+GSN\r\n")); 
 UART0_rx_on( );
 if( UART0_check_acknowledge( 63 ) > 0 )
 {
  char* pSrc = (char*)rx_buffer;
  u8 n = 0; u8 k = 0;
   while ((n < 15) && (k < 64))
   {       
    if ((*pSrc >= '0') && (*pSrc <= '9')) {*IMEIbuf++ = *pSrc; n++;}
    else if (*pSrc == 'O') break;
    *pSrc++; k++;
   }
   if (n == 15) {*pSrc =0x00; return 1;}
   else return -2;  
 }
 else return -1;
}

нашел в библиотеке GSM.h следующий код. как его можно адаптировать для использования без библиотеки?