Опять вопрос по Serial
- Войдите на сайт для отправки комментариев
Пнд, 13/05/2013 - 01:03
Отправляю и читаю данные как посоветовал leshak
передатчик
void setup() { pinMode(pot, INPUT); Serial.begin(57600); } void loop() { potVal = analogRead(pot); LSB = potVal & 0xff; MSB = (potVal >> 8) & 0xff; Serial.print("*"); Serial.write(LSB); Serial.write(MSB); }
приёмник
void setup() { Serial.begin(57600); } void loop() { if(Serial.available()>2) { char ch=Serial.read(); if(ch=='*'){ LSB = Serial.read(); MSB = Serial.read(); potVal = word(MSB, LSB); potVal = map(potVal, 0, 1023, 0, 1200); Serial.println(potVal); }
При чтении наблюдаю в мониторе странное явление - каждые 26 строк даные меняются в разы (в одной строчке ) и сразу возвращаются к предыдущим. С чем это связано и как с этим бороться?
Если убрать маркер, то этого явления нет. Но тогда проблема с чтением нескольких переменных.
Так покажите что в мониторе.
В скетче для приемника не хватает двух закрывающихся фигурных скобок.
Думаю Вы понимаете, что в передатчике MSB только два младших бита значащие, остальные "мусор". Я про маску 0xFF.
И да, ждем что в мониторе
При int potVal = analogRead(pot); не означает, что 10 бит - это данные, а остальное мусор, остальное нули, так что маска думаю не причем, даже если оставить только 2 бита MSB = (potVal >> 8) & 0x03;
Я напомнил только. На всякий случай.
скопировал с монитора - как по другому вставить изображение с монитора не знаю
Пречитайте сообщение http://arduino.ru/forum/programmirovanie/peredacha-dannykh-s-pomoshchyu-apc-220#comment-29898 в данном случае засерается приемный буфер UARTа.
Поигрался с delay - помогло, спасибо. В код передатчика добавил delay (2); и "засерания" практически не стало и шаговиком получается крутить.
Лучше всетаки не delay использовать, а отпрвлять данные только при изменении.
Попробую ввести мёртвую зону для потенциометра. О результатах отпишусь.
Попробовал отправлять данные при изменении данных с потенциометра
Serial "глотает" куски данных и при возвращении потенциометра в одно и то же положение передаются разные показания
>Serial "глотает" куски данных
Тут можно разное "придумать". Отправлять данные "не чаще чем раз в 500 ms". Опрашивать потенциометр пореже (слишком частый опрос - тоже может подключивать).
Если промежуточные значение не очень важны (важно куда именно в итоге повернулся потенциометр), может сделать логику типа "если потенциометр имеет одно и тоже значение +- погрещнось дольше чем XXX миллисекунд).
Вообщем в конечном итоге, у вас Seral имеет конечную скорость (Serial.begin(СКОРОСТЬ)). И всегда будет граница какой объем данных он может пропустить в единицу времени. Если вы данных генерите больше - они будут терятся.
>дно и то же положение передаются разные показания
Вообщем-то это нормально (если разброс показаний лежит в разумных пределах). Особенно у LSB. Все-таки и сам потенциометр имеет дребезг-погрешность, и АЦП (analogRead) тоже шума чуть-чуть добавляет.
P.S. Кстати тот кусок кода что вы показали - даже компилироватся не будет. Что за звери LSB, MSB? Нигде не объявлены. То есть по их имени можно догадатся, но....