Работа с COM портом

flashman
Offline
Зарегистрирован: 04.02.2014

Добрый вечер. Сразу оговорюсь в программировании ардуино я новичок. Нужна ваша помощь. 

В общем есть один проект в котором имеется необходимость считывать даные с ком порта. Но не просто считывать, а ожидать пока они там появяться. Вроде бы ничего сложного, однако что-то пошло не так. 

int k=10; // количество столбцов
int m=10; // количество строк
int i;
int j;
int progpin=13;
int data;
long myarray[10][10];

void setup()
{
Serial.begin(9600);
pinMode(progpin,OUTPUT);
digitalWrite (progpin,LOW);
attachInterrupt(5, programmer, RISING);
for (i=0; i<k; i++)
for (j=0; j<m; j++)
myarray[i][j]=random(100);
}
void loop()
{
for (i=0; i<k; i++)
{
delay(50);
Serial.println();
for (j=0; j<m; j++)
{
Serial.print(myarray[i][j], DEC);
Serial.print("; ");
delay(50);
}
}
Serial.println();
Serial.println();
}
void programmer()
{
delay(50);
digitalWrite(progpin, HIGH);
Serial.println();
Serial.print("Stolbsi:");
k=newvalue();
Serial.println(k);
Serial.println();
Serial.print("Stroki:");
m=newvalue();
Serial.println(m);
for (i=0; i<k; i++)
for (j=0; j<m; j++)
myarray[i][j]=random(100);
digitalWrite(progpin,LOW);
}
int newvalue()
{
data = Serial.read();
while (data <0)
{
delay(50);
data = Serial.read();
}
data = data - 48;
return data;
}

Вот код который я набросал дя примера, чтобы понять механизм. Прога просто печатает псевдо случайный массив, а в определнный момент, по внешнему прерыванию (у меня МЕГА я подключил 5-ое прерывание) - нажатие кнопки, прога переходит на функцию programmer для смены количества строк и столбцов. Смена происходит в функции newvalue и вот тут происходят чудеса. При простом нажатии на кнопку прерывания ардуина зависает, причем даже не пишеться надпись "Stolbsi:", которая находиться до цикла while. Если же сначала ввести в COM порт число из монитора порта, то оно вроде как передается но тоже не понятно как. А не понятно потому, что из функции newvalue возвращается не введенное в порт значение а значение которое присвоено data на стадии инициализации (в моем случае еще и минус 48, для раскодировки). Вот так, казалось простая задача, а ломаю голову уже второй день. Такое ощущение что не хочет работать цикл, причем пробывал разные варианты и с for и goto и еще не мало чего перепробывал. Нужно заставить ардуино именно ждать данные а не считывать уже там имеющиеся. Помогите чем можете. Заранее СПАСИБО!!!

flashman
Offline
Зарегистрирован: 04.02.2014

Вот разобрался как нормально код выложить



int k=10; // количество столбцов
int m=10; // количество строк
int i;
int j;
int progpin=13;
int data;
long myarray[10][10];

void setup()
{
  Serial.begin(9600);
  pinMode(progpin,OUTPUT);
  digitalWrite (progpin,LOW);
  attachInterrupt(5, programmer, RISING);
  for (i=0; i<k; i++)
    for (j=0; j<m; j++)
       myarray[i][j]=random(100);
}
void loop()
{ 
  for (i=0; i<k; i++)
    {
      delay(50);
      Serial.println();
      for (j=0; j<m; j++)
       {
        Serial.print(myarray[i][j], DEC);
        Serial.print("; ");
        delay(50);
       }
    }
  Serial.println();
  Serial.println();
}
void programmer()
{
  delay(50);
  digitalWrite(progpin, HIGH);
  Serial.println();
  Serial.print("Stolbsi:");
  k=newvalue();
  Serial.println(k);
  Serial.println();
  Serial.print("Stroki:");
  m=newvalue();
  Serial.println(m);
  for (i=0; i<k; i++)
    for (j=0; j<m; j++)
      myarray[i][j]=random(100);
 digitalWrite(progpin,LOW);
}
int newvalue()
{
  data = Serial.read();
  while (data <0)
    {
      delay(50);
      data = Serial.read();
    }
  data = data - 48;
  return data; 
}