Опять вопрос по Serial

vvadim
Offline
Зарегистрирован: 23.05.2012

Отправляю и читаю данные как посоветовал 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 строк даные меняются в разы (в одной строчке ) и сразу возвращаются к предыдущим. С чем это связано и как с этим бороться?

Если убрать маркер, то этого явления нет.  Но тогда проблема с чтением нескольких переменных. 

maksim
Offline
Зарегистрирован: 12.02.2012

Так покажите что в мониторе.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

В скетче для приемника не хватает двух закрывающихся фигурных скобок.

Думаю Вы понимаете, что в передатчике MSB только два младших бита значащие, остальные "мусор". Я про маску 0xFF.

И да, ждем что в мониторе

 

maksim
Offline
Зарегистрирован: 12.02.2012

При int potVal = analogRead(pot); не означает, что 10 бит - это данные, а остальное мусор, остальное нули, так что маска думаю не причем, даже если оставить только 2 бита MSB = (potVal >> 8) & 0x03;

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я напомнил только. На всякий случай.

vvadim
Offline
Зарегистрирован: 23.05.2012






96
96
96
96
96
96
12708
96
96
96
96
96
96
96
96
96
96
96
96
96
96
96
96
96
96
96
96
96
96
96
96
12708
96
96
96
96
96
96
96
96
96
96
96
96
96

скопировал с монитора - как по другому вставить изображение с монитора не знаю

maksim
Offline
Зарегистрирован: 12.02.2012

Пречитайте сообщение http://arduino.ru/forum/programmirovanie/peredacha-dannykh-s-pomoshchyu-apc-220#comment-29898 в данном случае засерается приемный буфер UARTа.

vvadim
Offline
Зарегистрирован: 23.05.2012

Поигрался с delay - помогло, спасибо. В код передатчика добавил delay (2); и "засерания" практически не стало и шаговиком получается крутить.

maksim
Offline
Зарегистрирован: 12.02.2012

Лучше всетаки не delay использовать, а отпрвлять данные только при изменении.

vvadim
Offline
Зарегистрирован: 23.05.2012

Попробую ввести мёртвую зону для потенциометра. О результатах отпишусь.

vvadim
Offline
Зарегистрирован: 23.05.2012

Попробовал отправлять данные при изменении данных с потенциометра



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 "глотает" куски данных и при возвращении потенциометра в одно и то же положение передаются разные показания

leshak
Offline
Зарегистрирован: 29.09.2011

>Serial "глотает" куски данных

Тут можно разное "придумать". Отправлять данные "не чаще чем раз в 500 ms". Опрашивать потенциометр пореже (слишком частый опрос - тоже может подключивать).

Если промежуточные значение не очень важны (важно куда именно в итоге повернулся потенциометр), может сделать логику типа "если потенциометр имеет одно и тоже значение +- погрещнось дольше чем XXX миллисекунд).

Вообщем в конечном итоге, у вас Seral имеет конечную скорость (Serial.begin(СКОРОСТЬ)). И всегда будет граница какой объем данных он может пропустить в единицу времени. Если вы данных генерите больше - они будут терятся.

>дно и то же положение передаются разные показания

Вообщем-то это нормально (если разброс показаний лежит в разумных пределах). Особенно у LSB. Все-таки и сам потенциометр имеет дребезг-погрешность, и АЦП (analogRead) тоже шума чуть-чуть добавляет.

P.S. Кстати тот кусок кода что вы показали - даже компилироватся не будет. Что за звери LSB, MSB?  Нигде не объявлены. То есть по их имени можно догадатся, но....