Опять вопрос по 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 использовать, а отпрвлять данные только при изменении.
Попробую ввести мёртвую зону для потенциометра. О результатах отпишусь.
Попробовал отправлять данные при изменении данных с потенциометра
int pot = A0; int dead = 2; int potVal, potValprev; void setup() { Serial.begin(57600); } void loop() { potVal = analogRead(pot); if(potVal < potValprev-dead || potVal > potValprev+dead) { potValprev = potVal; Serial.print("*"); Serial.write(LSB); Serial.write(MSB); } }Serial "глотает" куски данных и при возвращении потенциометра в одно и то же положение передаются разные показания
>Serial "глотает" куски данных
Тут можно разное "придумать". Отправлять данные "не чаще чем раз в 500 ms". Опрашивать потенциометр пореже (слишком частый опрос - тоже может подключивать).
Если промежуточные значение не очень важны (важно куда именно в итоге повернулся потенциометр), может сделать логику типа "если потенциометр имеет одно и тоже значение +- погрещнось дольше чем XXX миллисекунд).
Вообщем в конечном итоге, у вас Seral имеет конечную скорость (Serial.begin(СКОРОСТЬ)). И всегда будет граница какой объем данных он может пропустить в единицу времени. Если вы данных генерите больше - они будут терятся.
>дно и то же положение передаются разные показания
Вообщем-то это нормально (если разброс показаний лежит в разумных пределах). Особенно у LSB. Все-таки и сам потенциометр имеет дребезг-погрешность, и АЦП (analogRead) тоже шума чуть-чуть добавляет.
P.S. Кстати тот кусок кода что вы показали - даже компилироватся не будет. Что за звери LSB, MSB? Нигде не объявлены. То есть по их имени можно догадатся, но....