Эмуляция датчика, посылающего 32-байтные данные
- Войдите на сайт для отправки комментариев
Казалось бы простая задача, но что-то не выходит...
Итак, есть датчик, который раз в секунду посылает 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 ничего не показывает.
С кодом проблем нет, разбирайся со своим CommTest
Надо в цикле выводить отдельно каждый байт и через print http://arduino.ru/Reference/Serial/Print сразу HEX. Как - написано. Несколькими принтами формировать запятые, пробелы, h
0x42, 0x4D, 0x01, 0x1C
Это как раз коды B M и 2 ух крокозябл
Что выводите, то и видите !
Монитор порта занял порт и Commtest курит в сторонке. Надо смотреть через что то одно.
Всё правильно. Монитор показывает то, что посылается. Проблема-то в чём? Если Вы хотите посылать текст, так его и посылайте.
Пробелы, запятые формирует программа CommTest.
Грубо говоря, CommTest принимает в шестнадцатиричной системе байты с датчика "42 4D 00 и т. д.", просто выводит с пробелами, запятыми и прибавляет "h", чтобы было понятно, что это HEX (шестнадцатиричное число).
0x42, 0x4D, 0x01, 0x1C
Это как раз коды B M и 2 ух крокозябл
Что выводите, то и видите !
Монитор порта занял порт и Commtest курит в сторонке. Надо смотреть через что то одно.
Смотрю по очереди. В CommTest ничего не приходит.
Смотрю по очереди. В CommTest ничего не приходит.
либо не закрыли Монитор в Ардуине. либо парметры подключения КомТеста вашего неверные
Данные отсылаете в линию правильно
Так, походу надо подробнее расписать.
К COM-порту подключён (был) датчик через переходник - "USB-SERIAL CH340 (COM15)".
Датчик раз в секунду посылает 32 байта в COM-порт.
Я пишу программу на С#, которая принимает из COM-порта 32 байта (от датчика). Далее обрабатывает. Но это уже не важно.
Также я использую CommTest, который мне показывает эти 32 байта. Так, просто чтобы видеть, что в COM приходят данные. Выше я привёл пример с шестнадцатиричными данными, я могу их в десятичных или в ASCII привести, но это не важно.
Мне надо чтобы ардуина посылала 32 байта. Они у меня в программе в массиве в HEX виде. Я изменил скетч на отсылку 32 байт.
Ни моя программа, ни CommTest посылаемых ардуиной данных не видит. Возможно, надо указывать какой-нибудь "закрывающий байт" или какой-то командой подтверждать конец передачи данных, я не знаю...
Некоторые программы не умею работать с портами типа COM15, хотя и показывают их. Приходится драйвер в диспетчере устройств переназначать на COM2 или типа того.
слушайте, все уже поняли вашу проблему в прошлый раз. Все эти обьяснения ни к чему. Уверяю вас, тут все знают, что такое шестнадцатиричные значения :))) Так как у вас в Монитор Ардуино приходят "ВМ и две кракозябры" - значит передача идет верно.
Ищите проблемы на стороне приема. И это уже не имеет никакого отношения к коду на ардуино.
Для начала попробуйте вообще закрыть все экземпляры программа Ардуино ИДЕ - может оно эксклюзивно захватывает все порты. определяющиеся как платы ардуино.
слушайте, все уже поняли вашу проблему в прошлый раз. Все эти обьяснения ни к чему. Уверяю вас, тут все знают, что такое шестнадцатиричные значения :))) Так как у вас в Монитор Ардуино приходят "ВМ и две кракозябры" - значит передача идет верно.
Ищите проблемы на стороне приема. И это уже не имеет никакого отношения к коду на ардуино.
Для начала попробуйте вообще закрыть все экземпляры программа Ардуино ИДЕ - может оно эксклюзивно захватывает все порты. определяющиеся как платы ардуино.
Да. Вы правы. Проблема была на стороне приёма. И проблема в сигнале "Data Terminal Ready". Если в CommTest ставлю галочку "DataTerminalReady", то из порта с ардуинкой начинает принимать 32 байта.
Похоже, что CH340 как-то сама насильно впихивает данные в COM-порт :) А в случае с ардуиной, ей нужно посылать сигнал "Data Terminal Ready". Добавил в свою программу на C# "DtrEnable=true" и всё заработало.
dtr используется для перезагрузки ардуино
dtr используется для перезагрузки ардуино
Я не правильно выразился. Для работы с "ардуино вместо датчика" надо приёмник переводить в режим "Data Terminal Ready".