Работа с COM портом
- Войдите на сайт для отправки комментариев
Добрый вечер. Сразу оговорюсь в программировании ардуино я новичок. Нужна ваша помощь.
В общем есть один проект в котором имеется необходимость считывать даные с ком порта. Но не просто считывать, а ожидать пока они там появяться. Вроде бы ничего сложного, однако что-то пошло не так.
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 и еще не мало чего перепробывал. Нужно заставить ардуино именно ждать данные а не считывать уже там имеющиеся. Помогите чем можете. Заранее СПАСИБО!!!
Вот разобрался как нормально код выложить