Вопрос по использовнию Serial
- Войдите на сайт для отправки комментариев
Пт, 24/02/2017 - 22:40
Прошу помочь: на 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
print(x, HEX) выводит два символа - представление числа в 16-битной системе, а write(x) выводит "чистый" байт.
print(x, HEX) выводит два символа - представление числа в 16-битной системе, а write(x) выводит "чистый" байт.
Если x переменная типа byte, то print(x, HEX) выводит и в Serial и в Serial1 только один байт, причем они результаты отличаются ((
А какое значение у переменной, которую выводите? Подозреваю, что если оно меньше 0x10, то может быть выведен один байт.
Скетч я привел, в нем цикл до <16 с шагом 2, последнее значение 0x0E
Т.к. функция выводит именно представление (символами), то она может и не выводить 0, то есть отправлять только представление младшей тетрады.
А чего вы хотите добиться?
С этим бы я не согласился, т.к. тот же Serial.print выводит так как описано - хоть в виде HEX, хоть в текстовом виде.
Началось с того, что надо было прочитать данные от GPS-трекера, написал программу,но принимал абракадарбру. В то же время через адаптер на комп все читается правильно.
Решил посмотреть, что на тот же адаптер передает MEGA, вот и столкнулся с тем, что в собственный Serial выводится правильно, а в Serial1 какая-то ахинея, причем еще и зависящая от метода print/write.
Что нибудь подскажешь?
mrPG, при print и write выводимые данные обязаьтельно будут различными, при цикле до 16 с шагом 2 конечное значение дорлжно быть 0x0E. Все, что Вы ни приводите, работает правильно, в чем неправильность?
mrPG, при print и write выводимые данные обязаьтельно будут различными, при цикле до 16 с шагом 2 конечное значение дорлжно быть 0x0E. Все, что Вы ни приводите, работает правильно, в чем неправильность?
Почему различные? Например, при byte bb=0x06 что будет выведено Serial1.print(bb,HEX) и Serial1.write(bb)?
И там, и там результат должен быть одинаковым, в первом случае даже LF не добавится.
ASCII символ с кодом 6 относится к управляющим (не печатемым символам). При write(bb) в порт будет послан именно этот непечатаемый символ. Вероятнее всего, при приеме он либо вообще не будет отображен, либо отображен значком для неизвестных символов (квадратик или знак вопроса). При отсылке print(bb) в порт будет послан символ '6' с кодом 54 (десятичным), а при print(bb,HEX), вероятнее всего два символа '0' и '6' с кодами 48 и 54 соответственно. Впрочем, последнее зависит от реализации.
Все оказалось значительно проще: на выходе устройства RS232, а это совсем не UARTна входе Дуни ((
Теперь ищу адаптер TTL-RS232.