Эмуляция датчика, посылающего 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 байт.
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 посылаемых ардуиной данных не видит. Возможно, надо указывать какой-нибудь "закрывающий байт" или какой-то командой подтверждать конец передачи данных, я не знаю...
Некоторые программы не умею работать с портами типа COM15, хотя и показывают их. Приходится драйвер в диспетчере устройств переназначать на COM2 или типа того.
слушайте, все уже поняли вашу проблему в прошлый раз. Все эти обьяснения ни к чему. Уверяю вас, тут все знают, что такое шестнадцатиричные значения :))) Так как у вас в Монитор Ардуино приходят "ВМ и две кракозябры" - значит передача идет верно.
Ищите проблемы на стороне приема. И это уже не имеет никакого отношения к коду на ардуино.
Для начала попробуйте вообще закрыть все экземпляры программа Ардуино ИДЕ - может оно эксклюзивно захватывает все порты. определяющиеся как платы ардуино.
слушайте, все уже поняли вашу проблему в прошлый раз. Все эти обьяснения ни к чему. Уверяю вас, тут все знают, что такое шестнадцатиричные значения :))) Так как у вас в Монитор Ардуино приходят "ВМ и две кракозябры" - значит передача идет верно.
Ищите проблемы на стороне приема. И это уже не имеет никакого отношения к коду на ардуино.
Для начала попробуйте вообще закрыть все экземпляры программа Ардуино ИДЕ - может оно эксклюзивно захватывает все порты. определяющиеся как платы ардуино.
Да. Вы правы. Проблема была на стороне приёма. И проблема в сигнале "Data Terminal Ready". Если в CommTest ставлю галочку "DataTerminalReady", то из порта с ардуинкой начинает принимать 32 байта.
Похоже, что CH340 как-то сама насильно впихивает данные в COM-порт :) А в случае с ардуиной, ей нужно посылать сигнал "Data Terminal Ready". Добавил в свою программу на C# "DtrEnable=true" и всё заработало.
dtr используется для перезагрузки ардуино
dtr используется для перезагрузки ардуино
Я не правильно выразился. Для работы с "ардуино вместо датчика" надо приёмник переводить в режим "Data Terminal Ready".