Эмуляция датчика, посылающего 32-байтные данные

stromen
Offline
Зарегистрирован: 07.10.2021

Казалось бы простая задача, но что-то не выходит...

Итак, есть датчик, который раз в секунду посылает 32 байта. Чтобы увидеть, что шлёт датчик, использую программу CommTest. Данные имеют вид: "42h, 4Dh, 00h, 1Ch, 00h, 08h, 00h, 0Bh, 00h, 0Ch, 00h, 08h, 00h, 0Bh, 00h, 0Ch, 05h, E5h, 01h, BAh, 00h, 51h, 00h, 02h, 00h, 00h, 00h, 00h, 97h, 00h, 03h, 78h".

Чтобы не таскать датчики в офис (они в лаборатории), решил эмулировать на ардуинке. Достоверность данных мне не важна, главное, чтобы получать 32-байтный массив.

Имею китайскую ардуино Pro Micro на Atmega MEGA32U4. Решил взять с наскока (передаю пока только 4 байта):

byte ARR[4] = {0x42, 0x4D, 0x01, 0x1C};

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.write(ARR, 4);
  delay(1000);
}

...но тут же забуксовал. В "мониторе порта" из ArduinoIDE спамит "BM_и_две_кракозябры", а CommTest ничего не показывает.

rkit
Offline
Зарегистрирован: 23.11.2016

С кодом проблем нет, разбирайся со своим CommTest

nik182
Offline
Зарегистрирован: 04.05.2015

Надо в цикле выводить отдельно каждый байт и через print  http://arduino.ru/Reference/Serial/Print сразу HEX. Как - написано. Несколькими принтами формировать запятые, пробелы, h

Komandir
Offline
Зарегистрирован: 18.08.2018

0x42, 0x4D, 0x01, 0x1C

Это как раз коды B M и 2 ух крокозябл

Что выводите, то и видите !

Монитор порта занял порт и Commtest курит в сторонке. Надо смотреть через что то одно.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Всё правильно. Монитор показывает то, что посылается. Проблема-то в чём? Если Вы хотите посылать текст, так его и посылайте.

stromen
Offline
Зарегистрирован: 07.10.2021

Пробелы, запятые формирует программа CommTest.

Грубо говоря, CommTest принимает в шестнадцатиричной системе байты с датчика "42 4D 00 и т. д.", просто выводит с пробелами, запятыми и прибавляет "h", чтобы было понятно, что это HEX (шестнадцатиричное число).

stromen
Offline
Зарегистрирован: 07.10.2021

Komandir пишет:

0x42, 0x4D, 0x01, 0x1C

Это как раз коды B M и 2 ух крокозябл

Что выводите, то и видите !

Монитор порта занял порт и Commtest курит в сторонке. Надо смотреть через что то одно.

Смотрю по очереди. В CommTest ничего не приходит.

b707
Offline
Зарегистрирован: 26.05.2017

stromen пишет:

Смотрю по очереди. В CommTest ничего не приходит.

либо не закрыли Монитор в Ардуине. либо парметры подключения КомТеста вашего неверные

Данные отсылаете в линию правильно

stromen
Offline
Зарегистрирован: 07.10.2021

Так, походу надо подробнее расписать.

К COM-порту подключён (был) датчик через переходник - "USB-SERIAL CH340 (COM15)".

Датчик раз в секунду посылает 32 байта в COM-порт.

Я пишу программу на С#, которая принимает из COM-порта 32 байта (от датчика). Далее обрабатывает. Но это уже не важно.

Также я использую CommTest, который мне показывает эти 32 байта. Так, просто чтобы видеть, что в COM приходят данные. Выше я привёл пример с шестнадцатиричными данными, я могу их в десятичных или в ASCII привести, но это не важно.

Мне надо чтобы ардуина посылала 32 байта. Они у меня в программе в массиве в HEX виде. Я изменил скетч на отсылку 32 байт.

byte ARR[32] = {0x42, 0x4D, 0x00, 0x1C, 0x01, 0xBF, 0x0C, 0xCE, 0x13, 0xA6, 0x01, 0x29, 0x08, 0x88, 0x0D, 0x18, 0xFF, 0xFF, 0xA6, 0x97, 0x7E, 0xB4, 0x22, 0x29, 0x09, 0x1A, 0x02, 0x2C, 0x97, 0x00, 0x09, 0x7D};

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.write(ARR, 32);
  delay(1000);
}

Ни моя программа, ни CommTest посылаемых ардуиной данных не видит. Возможно, надо указывать какой-нибудь "закрывающий байт" или какой-то командой подтверждать конец передачи данных, я не знаю...

sadman41
Offline
Зарегистрирован: 19.10.2016

Некоторые программы не умею работать с портами типа COM15, хотя и показывают их. Приходится драйвер в диспетчере устройств переназначать на COM2 или типа того.

b707
Offline
Зарегистрирован: 26.05.2017

слушайте, все уже поняли вашу проблему в прошлый раз. Все эти обьяснения ни к чему. Уверяю вас, тут все знают, что такое шестнадцатиричные значения :))) Так как у вас в Монитор Ардуино приходят "ВМ и две кракозябры" - значит передача идет верно.

Ищите проблемы на стороне приема. И это уже не имеет никакого отношения к коду на ардуино.

Для начала попробуйте вообще закрыть все экземпляры программа Ардуино ИДЕ - может оно эксклюзивно захватывает все порты. определяющиеся как платы ардуино.

stromen
Offline
Зарегистрирован: 07.10.2021

b707 пишет:

слушайте, все уже поняли вашу проблему в прошлый раз. Все эти обьяснения ни к чему. Уверяю вас, тут все знают, что такое шестнадцатиричные значения :))) Так как у вас в Монитор Ардуино приходят "ВМ и две кракозябры" - значит передача идет верно.

Ищите проблемы на стороне приема. И это уже не имеет никакого отношения к коду на ардуино.

Для начала попробуйте вообще закрыть все экземпляры программа Ардуино ИДЕ - может оно эксклюзивно захватывает все порты. определяющиеся как платы ардуино.

Да. Вы правы. Проблема была на стороне приёма. И проблема в сигнале "Data Terminal Ready". Если в CommTest ставлю галочку "DataTerminalReady", то из порта с ардуинкой начинает принимать 32 байта.

Похоже, что CH340 как-то сама насильно впихивает данные в COM-порт :) А в случае с ардуиной, ей нужно посылать сигнал "Data Terminal Ready". Добавил в свою программу на C# "DtrEnable=true" и всё заработало.

Спасибо за ответы.
rkit
Offline
Зарегистрирован: 23.11.2016

dtr используется для перезагрузки ардуино

stromen
Offline
Зарегистрирован: 07.10.2021

rkit пишет:

dtr используется для перезагрузки ардуино

Я не правильно выразился. Для работы с "ардуино вместо датчика" надо приёмник переводить в режим "Data Terminal Ready".