Работа с 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 как то не очень работает...
все равно спасибо - буду копать дальше, направление получил, спасибо