Функция чтения из буфера серийного порта
- Войдите на сайт для отправки комментариев
Чт, 21/01/2016 - 08:59
Скетч не мой. Я новичек arduino, но есть желание разобраться. Неправильно отрабатывает "Функция чтения из буфера серийного порта gsm модема одной строки", а может быть и "Функция чтения всего буфера с серийного порта gsm модема" . При получении команды от модема gsmSerial определение "+CMT" происходит не каждый раз. Проверял в proteus и через монитор порта arduino на живом железе. Пробовал для теста менять "+СMT" на "1" опредение "1" тоже происходит не каждый раз.
#include <SoftwareSerial.h> // переменные SoftwareSerial gsmSerial(9, 11); // RX, TX String currentStr = ""; /* * Функция чтения всего буфера с серийного порта gsm модема */ String readSerial() { String inData = ""; if (gsmSerial.available() > 0) { int h = gsmSerial.available(); for (int i = 0; i < h; i++) { inData += (char)gsmSerial.read(); } return inData; } else { return "No connection"; } } /* * Функция чтения из буфера серийного порта gsm модема одной строки */ String readSerialStr() { String content = ""; boolean retStr=false; char currentChar; delay(100); while(gsmSerial.available() && retStr==false) { currentChar = gsmSerial.read(); //if (currentChar=='\n' || currentChar=='\r') { if (currentChar=='\n') { retStr=true; } else { content.concat(currentChar); } } return content; } void setup(){ // Начинаем последовательный обмен данными и ждем открытие порта Serial.begin(9600); Serial.flush(); gsmSerial.begin(9600); gsmSerial.flush(); // опрашиваем gsm-модем delay(500); gsmSerial.println("AT+CMGF=1"); // выставляем текстовым режим сообщений delay(500); gsmSerial.println("AT+IFC=1,1"); // Set Local Data Flow Control delay(500); gsmSerial.println("AT+CPBS=\"SM\""); // SIM Phonebook Memory Storage delay(500); gsmSerial.println("AT+CNMI=1,2,2,1,1"); // Включаю перехват SMS delay(500); Serial.println("System Ready ..."); // Инициализация после Сброса } void loop(){ //if (gsmSerial.available()){ // если в буфере серийного порта есть данные (для теста) // Serial.print((char)gsmSerial.read()); // отправить на модем (для теста) //} //if (Serial.available()){ // если в буфере серийного порта есть данные (для теста) // gsmSerial.print((char)Serial.read()); // отправить на модем (для теста) //} if (gsmSerial.available()){ // если в буфере серийного порта есть данные currentStr=readSerialStr(); // считываем одну строку из буфера серийного порта посимвольно currentStr.trim(); Serial.print(currentStr); if (currentStr.startsWith("+CMT")) { // и если текущая строка начинается с "+CMT", то следующая строка является сообщением currentStr=readSerialStr(); // считываем еще одну строку из буфера серийного порта посимвольно currentStr.trim(); //Serial.println("currentStr"); if (currentStr.compareTo("STATUS")==0) { // если sms сообщене это "STATUS" Serial.println("Command received. Execute 'STATUS'"); } } } }
В функции String readSerialStr() что произойдет если символы закончились, но последний символ не '\n', сообщение еще передается? Ты просто выйдешь из цикла while дальше все пойдет наперекосяк.