Скажите, а как принимать в порт ардуины данные по прерыванию?
Вид для печати
Скажите, а как принимать в порт ардуины данные по прерыванию?
if (Serial.available()) int inByte = Serial.read();
Не понял, а прерывание где происходит?
По прерыванию производится запись данных в буфер
Все это в библиотеке
Спасибо, но всё равно не понятно............
Так тебе в какой порт нужно serial? или INT0,INT1
Мне нужно чтоб вот это:
Создавало прерывание, то есть, чтоб таймер как-то слушал RX и если туда что-то прилетело, то вызывается прерывание и принимаются байты!PHP код:
//////////////////////////приём байт от компа//////////////////////////////////
if (Serial.available() > 0) //priem ot kompa
{
int inByte = Serial.read();
if (inByte ==1)
{
pboost = 0;
inByte =0;
}
}
Чтобы не пропустить прилетающие байты!!!
Как-то коряво я объяснил......
Эдуард, ты вот эту библиотеку имел в виду?
<NewSoftSerial.h>
Эдуард посмотри пожалуйста, почему так получается?
Вот скетч принимающего устройства (Atmega 168), она принимает данные от другой кардуины и выводит их на экран:
Когда delay(10); закоментировано, данные выводятся нормально в течении 3 минут, после этого начинает показывать всякую чепуху!PHP код:
//#include <SoftwareSerial.h>
#include <TVout.h>
#include <fontALL.h>
TVout TV;
//SoftwareSerial mySerial(2, 3);
//int ffff = 0;
byte serialInArray[8];
int serialCount = 0;
int inByte = 0;
int watertemp = 0;
int turbo = 0;
int volts = 0;
int pboost = 0;
int result = 0;
void setup()
{
TV.begin(PAL,90,40); // 1 ширина, 2 высота
TV.select_font(font6x8); // 1 ширина, 2 высота
Serial.begin(115200);
// mySerial.begin(57600);
}
void loop()
{
// TV.clear_screen();
TV.set_cursor(0,6);
TV.print("TMP ");
TV.print(watertemp);
TV.set_cursor(40,6);
TV.println(volts);
TV.set_cursor(0,14);
TV.print("TURBO ");
TV.println(turbo);
TV.set_cursor(0,22);
TV.print("PEAK ");
TV.println(pboost);
TV.set_cursor(0,30);
TV.print("RPM ");
TV.println(result);
//delay(100);
if (Serial.available() > 7) //priem ot kompa
{
inByte = Serial.read();
serialInArray[serialCount] = inByte;
serialCount++;
if (serialCount ==8)
{
watertemp = serialInArray[0]; //senstvaz
turbo = serialInArray[1]; //kpa
pboost = serialInArray[2]; //pboost
volts = serialInArray[3]; //volts
result = serialInArray[7];
result = (result << 24) | serialInArray[6];
result = (result << 16) | serialInArray[5];
result = (result << 8) | serialInArray[4];
serialCount = 0;
inByte = 0;
Serial.flush();
}
}
// delay(10);
}
Если delay(10); раскоментировать, то нормально работает только 5 секунд и тоже самое, показания превращаются в хаос из цифр))))
Из-за чего так? Может это буфер приёмный как-то переполняет память или ещё что-то?
Если менять скорость порта на меньшую, то всё становится ещё хуже!
Я почему про буфер подумал, если из скетча залитого в передающие устройство, убрать значительную часть кода (оно же побыстрей станет), то приемное устройство сразу же начинает показывать искажённые данные, без всяких 5 секунд.
Ошибка в том что у тебя нет цикла приема 8-ми байт , ты принимаешь каждый раз по 1 байту
используй цикл for
PHP код:
if (Serial.available() > 7) //priem ot kompa
{
for (byte i=0; i < 9; i++)
{
serialInArray[i] = Serial.read();
{
Спасибо большое!!!
Вот так сделал:
Всё заробило!!!!!PHP код:
if (Serial.available() > 7) //priem ot kompa
{
for (byte i=0; i < 9; i++)
{
serialInArray[i] = Serial.read();
}
}
watertemp = serialInArray[0]; //senstvaz
turbo = serialInArray[1]; //kpa
pboost = serialInArray[2]; //pboost
volts = serialInArray[3]; //volts
result = serialInArray[7];
result = (result << 24) | serialInArray[6];
result = (result << 16) | serialInArray[5];
result = (result << 8) | serialInArray[4];
// Serial.flush();
delay(10);
}
А можно ещё какую-нибудь проверку сделать, для надёжности?
Если проводок между приёмником и передатчиком, отключать и снова втыкать, то кратковременно (1-2 секуды) проскакивают непонятные цифры, а потом всё отлично работает!
http://s55.radikal.ru/i150/1112/dc/faf71f05764a.jpg
http://s017.radikal.ru/i422/1112/de/b1088c7a9ae0.jpg
Можно перед началом данных посылать дескриптор размером 2 байта например 170, 204 или что то в этом роде
А почему именно два байта? А если один?
А как ты один байт от байта данных отличишь?
Надо подумать.............а если это буква будет? ......Хотя я наверно чего-то не понимаю!
Байт - это значение от 0 до 255 и такие же байты в данных, так как отличить дескриптор?
а дескриптор это два байта идентификации. Вероятность подобной комбинации в массиве равна нулю.
Не 100% , чем длинней дескриптор тем меньше вероятность совпадения.
Думаю что предложенный тобой вариант в этом случаи более интересен.
Я вместо деления значения аналогового сигнала на 4 использую map(val, 0, 1023, 0, 254) и все. Аналогично подготавливаю значения для передачи значений в Ардуину.
А можно ещё и пример, до кучи ? )))
В передающем пакете все данные подготавливаете в диапазоне 0-254, а первым посылаете дескриптор равный 255.
В приемном устройстве отсчитываете количество данных + 1, проверяете наличие и соответствие дескриптора, а потом принимаете данные.
Если не понятно, дайте свой полный пример и я на нем покажу.
Вот код:
Тут ещё одна непонятная для меня вещь возникла....PHP код:
#include <TVout.h>
#include <fontALL.h>
TVout TV;
byte serialInArray[8];
int watertemp = 0;
int turbo = 0;
int volts = 0;
int pboost = 0;
int result = 0;
//byte i = 0;
void setup()
{
TV.begin(PAL,90,40); // 1 ширина, 2 высота
TV.select_font(font6x8); // 1 ширина, 2 высота
Serial.begin(115200);
}
void loop()
{
if (Serial.available() > 7)
{
for (byte i=0; i < 8; i++)
{
serialInArray[i] = Serial.read();
}
}
watertemp = serialInArray[0]; //senstvaz
turbo = serialInArray[1]; //kpa
pboost = serialInArray[2]; //pboost
volts = serialInArray[3]; //volts
result = serialInArray[7];
result = (result << 24) | serialInArray[6];
result = (result << 16) | serialInArray[5];
result = (result << 8) | serialInArray[4];
//Serial.flush();
//serialInArray[i] = 0;
delay(50);
TV.clear_screen();
TV.set_cursor(0,6);
TV.print("TMP ");
TV.print(watertemp);
TV.set_cursor(40,6);
TV.println(volts);
TV.set_cursor(0,14);
TV.print("TURBO ");
TV.println(turbo);
TV.set_cursor(0,22);
TV.print(freeRam());
// TV.println(pboost);
TV.set_cursor(0,30);
TV.print("RPM ");
TV.println(result);
}
Массив обьявлен как:
byte serialInArray[8];
Вот он принимается:
if (Serial.available() > 7)
{
for (byte i=0; i < 8; i++)
{
serialInArray[i] = Serial.read();
}
Вот в этой строчке - for (byte i=0; i < 8; i++) , должно быть i < 8 или i < 9 ?
Работает в обоих случаях, а как правильно будет?
И ВСЕХ С НОВЫМ ГОДОМ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!))))))))) ))))))))))))))))))))))))))))
должно быть i < 8, потому что массив имеет размерность 8 значенийЦитата:
Вот в этой строчке - for (byte i=0; i < 8; i++) , должно быть i < 8 или i < 9 ?
Работает в обоих случаях, а как правильно будет?
Спасибо Эдуард!
Эдуард , ты два раздельных байта имел в виду или как массив?Цитата:
Можно перед началом данных посылать дескриптор размером 2 байта например 170, 204 или что то в этом роде
Щас вот так сделал, но боюсь что это не совсем мне подходит.
Если они раздельные, то как должен выглядеть приём, подскажи пожалуйста?PHP код:
void loop()
{
if (Serial.available() > 8)
{
if(Serial.read() == 255)
{
for (byte i=0; i < 8; i++)
{
serialInArray[i] = Serial.read();
}
}
}
Правильно