Работа с СОМ-портом

slavka
Offline
Зарегистрирован: 18.06.2013

Здравствуйте, форумчане.
Я написал (скетч вроде называется), который получает шести символьную ASCII строку (с символом окончания строки и без неё, символы от 0 до 9). Эта строка переводится в число, которое можно в последствии обрабатывать(в примере выводится в СОМ-порт). Но почему-то не все шести символьные комбинации правильно обрабатываются.

byte block[6]={B0,B0,B0,B0,B0,B0};
unsigned long blok=0;
void setup() {
Serial.begin(9600); // устанавливаем последовательное соединение
}
void loop() {
if(Serial.available() > 0){
delay(100);
block[0]=Serial.read()-48;
block[1]=Serial.read()-48;
block[2]=Serial.read()-48;
block[3]=Serial.read()-48;
block[4]=Serial.read()-48;
block[5]=Serial.read()-48;
blok=100000*block[0]+10000*block[1]+1000*block[2]+100*block[3]+10*block[4]+block[5];
block[6]=B0,B0,B0,B0,B0,B0,B0;
Serial.println(blok);}
}

Почему при отправке 357951 получаю 292415?

tsostik
Offline
Зарегистрирован: 28.02.2013

slavka пишет:
Почему при отправке 357951 получаю 292415?

Потому, что 10000*block[1] - это signed int и равно не 50000, а -15536

Можно сделать так:

byte block[6]={B0,B0,B0,B0,B0,B0};
unsigned long blok=0;
void setup() 
{
  Serial.begin(9600); // устанавливаем последовательное соединение
}
void loop() 
{
  if(Serial.available() > 0)
  {
    delay(100);
    block[0]=Serial.read()-48;
    block[1]=Serial.read()-48;
    block[2]=Serial.read()-48;
    block[3]=Serial.read()-48;
    block[4]=Serial.read()-48;
    block[5]=Serial.read()-48;
    blok=100000UL*block[0] + 10000UL*block[1] + 1000UL*block[2] + 100UL*block[3] + 10UL*block[4] + block[5];
    block[6]=B0,B0,B0,B0,B0,B0,B0;
    Serial.println(blok);
  }
}

Но лучше воспользоваться функцией Serial.ParseInt()

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

Пототому что потому что мы пилоты...

blok=100000*block[0]+10000UL*block[1]+1000*block[2]+100*block[3]+10*block[4]+block[5];

А вообще что бы не изобретать такие не лепые конструкции почитайте Serial.parseInt().

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

Опередили )

slavka
Offline
Зарегистрирован: 18.06.2013

Спасибо, tsostik, выводит что надо.

slavka
Offline
Зарегистрирован: 18.06.2013

Максим, пускай МК считает. Он и так 98% времени впустую работать будет, а время в 1 секунду не критично. Но для кругозора изучу функцию.