Вопрос по использовнию Serial

mrPG
Offline
Зарегистрирован: 01.06.2016

Прошу помочь: на MEGA2560  столкнулся с проблемой при выводе в Serial1.

При использовании Serial1.print(bch,HEX) и Serial1.write(bch) значения отличаются друг от друга и не совпадают с тем, что выводится для контроля в Serial.print(bch), в который выводится правильно.

Результат вывода в Serial1 читаю терминальной программой через адаптер USB-RS.

Используемый скетч:


long  _time = 0;
long  _time0;

byte    bch     = 0;
uint8_t  _count = 0;

//-------------------------------------------------------------------------------------
void setup() 
{
  Serial.begin(9600);
  Serial1.begin(9600, SERIAL_8N1);    
  Serial.println("BEGIN");
  _time  = millis();
  _time0 = _time + 1000; 
}

//--------------------------------------------------------------------------
void loop() 
{
 _time = millis();
 if ((_time >= _time0) && (_count <16))
   {     
     Serial1.print(bch,HEX);  
     delay(300);
     Serial1.write(bch);     
     delay(300);
     
     Serial.print(_count,HEX);
     Serial.print("  ");
     Serial.println(bch,HEX);

     _time0 += 1000;
     _count += 2;
     bch    += 2;
   }  
} // end of loop

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

print(x, HEX) выводит два символа - представление числа в 16-битной системе, а write(x) выводит "чистый" байт.

mrPG
Offline
Зарегистрирован: 01.06.2016

Yarik.Yar пишет:

print(x, HEX) выводит два символа - представление числа в 16-битной системе, а write(x) выводит "чистый" байт.

Если x переменная типа byte, то print(x, HEX) выводит и в Serial и в Serial1 только один байт, причем они результаты отличаются ((

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

А какое значение у переменной, которую выводите? Подозреваю, что если оно меньше 0x10, то может быть выведен один байт.

mrPG
Offline
Зарегистрирован: 01.06.2016

Yarik.Yar пишет:
А какое значение у переменной, которую выводите? Подозреваю, что если оно меньше 0x10, то может быть выведен один байт.

Скетч я привел, в нем цикл до <16 с шагом 2, последнее значение 0x0E

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Т.к. функция выводит именно представление (символами), то она может и не выводить 0, то есть отправлять только представление младшей тетрады.
А чего вы хотите добиться?

mrPG
Offline
Зарегистрирован: 01.06.2016

Yarik.Yar пишет:
Т.к. функция выводит именно представление (символами), то она может и не выводить 0, то есть отправлять только представление младшей тетрады. А чего вы хотите добиться?

С этим бы я не согласился, т.к. тот же Serial.print выводит так как описано - хоть в виде HEX, хоть в текстовом виде.

Началось с того, что надо было прочитать данные от GPS-трекера, написал программу,но принимал абракадарбру. В то же время через адаптер на комп все читается правильно.

Решил посмотреть, что на тот же адаптер передает MEGA, вот и столкнулся с тем, что в собственный Serial выводится правильно, а в Serial1 какая-то ахинея, причем еще и зависящая от метода print/write.

Что нибудь подскажешь?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

mrPG, при print и write выводимые данные обязаьтельно будут различными, при цикле до 16 с шагом 2 конечное значение дорлжно быть 0x0E. Все, что Вы ни приводите, работает правильно, в чем неправильность?

mrPG
Offline
Зарегистрирован: 01.06.2016

andriano пишет:

mrPG, при print и write выводимые данные обязаьтельно будут различными, при цикле до 16 с шагом 2 конечное значение дорлжно быть 0x0E. Все, что Вы ни приводите, работает правильно, в чем неправильность?

Почему различные? Например, при byte bb=0x06 что будет выведено Serial1.print(bb,HEX) и Serial1.write(bb)?

И там, и там результат должен быть одинаковым, в первом случае даже LF не добавится.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ASCII символ с кодом 6 относится к управляющим (не печатемым символам). При write(bb) в порт будет послан именно этот непечатаемый символ. Вероятнее всего, при приеме он либо вообще не будет отображен, либо отображен значком для неизвестных символов (квадратик или знак вопроса). При отсылке print(bb) в порт будет послан символ '6' с кодом 54 (десятичным), а при print(bb,HEX), вероятнее всего два символа '0' и '6' с кодами 48 и 54 соответственно. Впрочем, последнее зависит от реализации.

mrPG
Offline
Зарегистрирован: 01.06.2016

Все оказалось значительно проще: на выходе устройства RS232, а это совсем не UARTна входе Дуни ((

Теперь ищу адаптер TTL-RS232.