Работа с UART
- Войдите на сайт для отправки комментариев
Добрый день, появился следующий вопрос
имеется шилд - http://www.seeedstudio.com/wiki/GPRS_Shield_V2.0
Написал отладочную программу - по аналогии с той что на сайте (только мне нужно ловить все коды символов что приходят от модема, поэтому ее чуть модифицировал)
Работаю на Ардуино Мега - с исспользвоанием Сериал1
Суть проблемы - хардварный буфер Сериал1 всего 64 байта, сообщение с порта я ловлю в начале основного цикла, потом идет обрадобка полученных данных - и она занимает столько времени что приходит оставшаяся часть сообщения от модема (точнее несколько частей по 64 байта) и все эти промежуточные части я теряю - потому что слишком долго обрабатывается основное тело программы.
Как быть? - есть вариант написать процедуру чтения данных из Сериал1 и запускать по прерыванию - когда приходят данные на Сериал1, но как это связать\сделать - даже идеи нет
Есть совсем другой вариант - но уж слишком ресурсоемкий, можно сделать Софтваре Сериал - и я уже научился расширять на нем буфер до нужного мне объема. это дениственный способ? если да - то на какие пины можно на Меге задействовать сериал ? пробовал согласно даташиту - все равно не получилось, кто лично пробовал - какие пины реально рабоатют?
Листинг моей процедуры
//Serial Relay - Arduino will patch a //serial link between the computer and the GPRS Shield //at 19200 bps 8-N-1 //Computer is connected to Hardware UART //GPRS Shield is connected to the Software UART #include <SoftwareSerial.h> unsigned char buffer[150]; // buffer array for data recieve over serial port int count=0; // counter for buffer array int tmpint=0; int i=0; void setup() { Serial1.begin(19200); // the GPRS baud rate Serial.begin(19200); // the Serial port of Arduino baud rate. } void loop() { if (Serial1.available()) // if date is comming from softwareserial port ==> data is comming from gprs shield { for(i=0;i<=10;i++){ // Тут происходит фигня - основное тело программы выполняется медленне чем надо, и буфер Сом порта перетирается delay(10); while(Serial1.available()) // reading data into char array { // delay(1); buffer[count++]=Serial1.read(); // writing data into array if(count == 150) {break;} } } } if(count!=0) { for (i=0;i<=count;i++) { Serial.print(" #"); // if no data transmission ends, write buffer to hardware serial port Serial.print(i); // if no data transmission ends, write buffer to hardware serial port Serial.print(" - "); // if no data transmission ends, write buffer to hardware serial port switch(buffer[i]) // печать служебных символов и просто символов { case 10: Serial.print("NL"); break; // если в ответе встречается служебный символ - Новая линия (New Line) печатай NL case 13: Serial.print("CR"); break; // если в ответе встречается служебный символ - Перевод каретки (Enter) печатай CR default: Serial.write(buffer[i]); } Serial.print(" - "); // if no data transmission ends, write buffer to hardware serial port tmpint = buffer[i]; Serial.println(tmpint); // if no data transmission ends, write buffer to hardware serial port } /* Serial.println("++++++++++++++++++++++++++++++++++"); Serial.println(""); Serial.write(buffer,count); Serial.println(""); Serial.println("__________________________________"); */ } if(count!=0) { Serial.println("++++++++++++++++++++++++++++++++++"); Serial.println(""); Serial.write(buffer,count); Serial.println(""); Serial.println("__________________________________"); } if(count!=0) { clearBufferArray(); if(i!=0) {i=0;} // clear counter if(count!=0) {count=0;} // clear counter } if (Serial.available()) // if data is available on hardwareserial port ==> data is comming from PC or notebook Serial1.write(Serial.read()); // write it to the GPRS shield } void clearBufferArray() // function to clear buffer array { for (int i=0; i<count;i++) { buffer[i]=NULL;} // clear all index of array with command NULL }
Открываете файл \arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp
В нем есть строки:
Меняете 64 на сколько вам надо, естественно в разумных пределах, сохраняете файл и радуетесь.
Спасибо большое - в примерах библиотека HardwareSerial нигде не встречается - поэтому не знал о ней, хотя СофтВареСериал - сам нашел и подправил :-)
Только хотел уточнить - наверно вы имели ввиду HardwareSerial.h, а не СРР, и почему то у меня там стоит БуферСайз - 128 а не 64, а выдает он реально только 64 ... что то не так... (завтра проверю - сейчас под рукой ничего нет)
Версия IDE какая?
В общем не важно. Скачайте актуальную релизную версию IDE то есть 1.0.5.
А если 1,5,4 ? (у меня такая стоит)
#4
понятно,
просто на 7ке - лично у меня, 1,0,5 как то не очень работает...
все равно спасибо - буду копать дальше, направление получил, спасибо