Работа с UART

MABP
Offline
Зарегистрирован: 18.02.2014

Добрый день, появился следующий вопрос 
имеется шилд - 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
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Открываете файл \arduino-1.0.5\hardware\arduino\cores\arduino\HardwareSerial.cpp

В нем есть строки:

#if (RAMEND < 1000)
  #define SERIAL_BUFFER_SIZE 16
#else
  #define SERIAL_BUFFER_SIZE 64
#endif

Меняете 64 на сколько вам надо, естественно в разумных пределах, сохраняете файл и радуетесь.

MABP
Offline
Зарегистрирован: 18.02.2014

Спасибо большое - в примерах библиотека HardwareSerial нигде не встречается - поэтому не знал о ней, хотя СофтВареСериал - сам нашел и подправил :-)

Только хотел уточнить - наверно вы имели ввиду HardwareSerial.h,  а не СРР, и почему то у меня там стоит БуферСайз - 128 а не 64, а выдает он реально только 64 ... что то не так... (завтра проверю - сейчас под рукой ничего нет)

 

maksim
Offline
Зарегистрирован: 12.02.2012

Версия IDE какая?

maksim
Offline
Зарегистрирован: 12.02.2012

В общем не важно. Скачайте актуальную релизную версию IDE то есть 1.0.5.

MABP
Offline
Зарегистрирован: 18.02.2014

А если 1,5,4 ? (у меня такая стоит)

maksim
Offline
Зарегистрирован: 12.02.2012

#4

MABP
Offline
Зарегистрирован: 18.02.2014

понятно, 
просто на 7ке  - лично у меня, 1,0,5 как то не очень работает... 
все равно спасибо - буду копать дальше, направление получил, спасибо