Arduino принимает только альтернативные символы
Я пишу код Arduino для получения SMS от модуля SIM800, а затем отправляю это же сообщение обратно отправителю. Мой код выглядит следующим образом:
#include<SoftwareSerial.h>
SoftwareSerial mySerial(9, 10);//подключиться к контактам 9 и 10 на модуле GSM
const byte numChars = 128; // размер символа
char receivedChars[numChars]; // Сохраняем данные, считанные из SMS
boolean newData = false; //флаг для проверки поступления новых данных
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
Serial.println("<Arduino is ready>");
mySerial.println("AT");
mySerial.println("AT+CMGF=1"); //текстовый режим
mySerial.println("AT+CNMI=1,2,0,0,0");
mySerial.println("AT+CSQ"); //Проверяем силу сигнала
while (Serial.available())
{
mySerial.write(Serial.read());//Пересылаем полученный Serial на программный последовательный порт
}
while(mySerial.available())
{
Serial.write(mySerial.read());//Пересылаем то, что software serial получил в последовательный порт
}
}
void loop() {
//код для проверки смс
scanSMS();
//Печать, если пришли новые данные
showNewData();
delay(25000);
}
void scanSMS() {
static boolean recvInProgress = false;
static byte ndx = 0;
char startMarker = '#'; //Маркеры начала и конца. Например. Текст SMS будет отправлен как #status#
char endMarker = '#';
char rc;
while (Serial.available())
{
mySerial.write(Serial.read());//Пересылаем полученный Serial на программный последовательный порт
}
while (mySerial.available() > 0 && newData == false) {
Serial.write(mySerial.read());//Пересылаем то, что software serial получил в последовательный порт
rc = mySerial.read();
if (recvInProgress == true) {
if (rc != endMarker) {
receivedChars[ndx] = rc;
ndx++;
if (ndx >= numChars) {
ndx = numChars - 1;
}
}
else {
receivedChars[ndx] = '\0'; // завершаем строку
recvInProgress = false;
ndx = 0;
newData = true;
}
}
else if (rc == startMarker) {
recvInProgress = true;
}
}
}
/*PRINT IF THERE IS A NEW DATA*/
void showNewData() {
if (newData == true) {
SendMessage(receivedChars);
newData = false;
}
}
/*SEND BACK WHATEVER SMS IS RECEIVED*/
void SendMessage(String receivedChars)
{
Serial.print("here");
mySerial.println("AT+CMGS=\"+xxxxxxxxxx\"\r"); // Заменить x на номер мобильного телефона
mySerial.println("Humidity Alert!");// Текст SMS, который вы хотите отправить
mySerial.print(receivedChars);
mySerial.println((char)26);// ASCII-код CTRL+Z
}
Проблема в том, что модуль получает только альтернативные символы, а не все сообщение. Например, если я отправлю текст #program#, Arduino напечатает только porm или rga. Я что-то упустил здесь? Любая помощь приветствуется.
@Monty Swanson, 👍1
1 ответ
Вы писали:
Serial.write(mySerial.read());
rc = mySerial.read();
Здесь вы дважды вызываете mySerial.read()
и таким образом читаете два
символов из входного буфера порта. Затем вы пересылаете первый
через Serial
и обработайте второй. Обратите внимание, что вы
обычно не должен читать два символа, если вы не проверили это
mySerial.available() >= 2
.
Возможно, вы захотите пересылать и обрабатывать по одному символу за раз, поэтому
вызовите mySerial.read()
только один раз в этом цикле:
rc = mySerial.read(); // чтение из mySerial
Serial.write(rc); // вперед через Serial
// теперь обрабатываем rc
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
- AT-команда не отвечает на последовательный монитор