Ответ от модуля SIM800l прерывается

uart sim800 raspberrypi-pico

У меня есть модуль sim800l, подключенный к аппаратному UART Rpi pico

/*
SIM800       RPi Pico
5v           *External 2A 5v supply*
GND          GND
VDD          3v3
TXD          GP1
RXD          GP0
*/

void setup()
{
  Serial.begin(115200);

  while (!Serial)
    ;

  Serial1.begin(9600);

  Serial.print("Initializing");
  delay(1000);
  Serial.print(".");
  delay(1000);
  Serial.print(".");
  delay(1000);
  Serial.println(".");

  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH);


  Serial1.println("AT"); // Как только тест рукопожатия будет успешным, он вернется к OK
  updateSerial();
  delay(3000);

  Serial1.println("ATI"); //Возвращает имя модуля и версию.
  updateSerial();
  delay(3000);

  Serial1.println("AT+CCID"); //Прочитайте информацию о SIM-карте, чтобы убедиться, что SIM-карта подключена
  updateSerial();
  delay(3000);

  Serial1.println("AT+COPS?"); //Проверяем, к какой сети вы подключены
  updateSerial();
  delay(3000);

  Serial1.println("AT+COPS=?"); //Возвращает список операторов, присутствующих в сети.
  updateSerial();
  delay(3000);

}

void loop()
{
  updateSerial();
}

void updateSerial()
{
  delay(200);
  while (Serial.available())
  {
    Serial1.write(Serial.read());//Пересылаем полученный Serial на программный последовательный порт
  }
  while (Serial1.available())
  {
    Serial.write(Serial1.read());//Пересылаем то, что ПО Serial получило на Serial Port
  }

}

ответ терминала

AT
OK
ATI
SIM800 R14.18

OK
AT+CCID
XXXXXXXXXXXXXXXXXXXX
AT+COPS?
+COPS: 0,0,"Vodaa TelAT+COPS=?
+COPS: (2,"Vodaa Telecom","Ver

Насколько мне известно, SIM800L всегда заканчивает свой ответ знаком "ОК". но есть некоторые команды, которые обрываются и не заканчиваются на OK. например, AT+CDID и AT+COPS. Не знаю проблема в пико или в сим800л. Sim800l, похоже, работает нормально, поэтому я подозреваю, что это связано с пико, но если это так, это может быть проблема с внутренними библиотеками, которые мне не по силам. Чтобы поддержать эту теорию, количество символов, которые вырезаются, составляет около 20 символов, поэтому, возможно, это параметр, который мне нужно настроить

, 👍-1

Обсуждение

подсказка: всегда заканчивает свой ответ "ОК"... в ответе больше, чем ОК... подсчитайте количество фактически полученных символов, @jsotola

скорость 115200 бод медленная. между байтами есть промежутки, поэтому while (Serial1.available()) может закончиться до того, как будет прочитан полный ответ., @Juraj

@jsotola извините, я не понимаю .. Я посчитал, сколько команд serial1.read() pe. AT=9 символов, ATI=27, AT+CCID=31, AT+COPS? = 31, AT+COPS=? это 9, после чего следует длинная пауза, а затем снова 31. похоже, что 31 - это предел,, @DrakeJest

@Juraj Я не думаю, что смогу подняться выше этого, я пытался исследовать этот конец, думая, что это проблема скорости передачи данных, согласно [этой теме](https://arduinoprosto.ru/q/36039/sim800l- change-default-baud-rate) 115200 — максимально возможное значение, @DrakeJest

Я не предлагал более высокую скорость передачи, но правильное чтение ввода, @Juraj


1 ответ


0

У меня ушло довольно много времени, но после прочтения документации по pico

Размер приемного FIFO также можно изменить с 32 по умолчанию. байт с помощью вызова setFIFOSize перед вызовом begin()

Serial1.setFIFOSize(128); 
Serial1.begin(baud);

установка гораздо большего значения, например 256, решает проблему

,