Arduino Uno, передача данных по COM-порту, "искривляются" байты
- Войдите на сайт для отправки комментариев
Пнд, 30/07/2018 - 19:06
Доброго времени суток.
Совершеннейший новичок, пишу первый скетч для Arduino Uno. Необходимо, чтобы Ардуино передавала байты, а программа на компе ловила их. Ардуино подключена на встроенный порт компа COM1 пинами 0 и 1, земля на соответствующем пине.
Проблема в следующем. Для теста Ардуино каждые две с половиной секунды отправляет один и тот же байт - 65 (латинская A).
На компе написаны две проги - на Дельфи и на Си++. Делфовская каждые две секунды принимает по очереди два байта - 250 и 95. Сишная прога принимает один раз в произвольное время разное количество разных байтов, всё остальное время принимает нулевые байты.
Ардуиновский монитор порта вообще выдаёт непрерывную строку квадратиков без задержки.
Вот скетч:
byte i=0; int led=13; void setup() { Serial.begin(9600,SERIAL_8N1); // Добавил параметры уже от отчаяния pinMode(led, OUTPUT); i=65; } void loop() { Serial.write(i); digitalWrite(led, HIGH); delay(2000); digitalWrite(led, LOW); delay(500); }
Процедура приёма данных на Си++
//главная функция потока, реализует приём байтов из COM-порта DWORD WINAPI ReadThread(LPVOID) { COMSTAT comstat; //структура текущего состояния порта, в данной программе используется для определения количества принятых в порт байтов DWORD btr, temp, mask, signal; //переменная temp используется в качестве заглушки overlapped.hEvent = CreateEvent(NULL, true, true, NULL); //создать сигнальный объект-событие для асинхронных операций SetCommMask(COMport, EV_RXCHAR); //установить маску на срабатывание по событию приёма байта в порт while(1) //пока поток не будет прерван, выполняем цикл { WaitCommEvent(COMport, &mask, &overlapped); //ожидать события приёма байта (это и есть перекрываемая операция) signal = WaitForSingleObject(overlapped.hEvent, INFINITE); //приостановить поток до прихода байта if(signal == WAIT_OBJECT_0) //если событие прихода байта произошло { if(GetOverlappedResult(COMport, &overlapped, &temp, true)) //проверяем, успешно ли завершилась перекрываемая операция WaitCommEvent if((mask & EV_RXCHAR)!=0) //если произошло именно событие прихода байта { ClearCommError(COMport, &temp, &comstat); //нужно заполнить структуру COMSTAT btr = comstat.cbInQue; //и получить из неё количество принятых байтов if(btr) //если действительно есть байты для чтения { ReadFile(COMport, bufrd, btr, &temp, &overlapped); //прочитать байты из порта в буфер программы counter+=btr; //увеличиваем счётчик байтов ReadPrinting(); //вызываем функцию для вывода данных на экран и в файл } } } } }
Помогите понять, что я делаю не так? :(
скорость в мониторе порта ?
Те же 9600, как и в скетче.
порт смотрите какой, com1 или ардуиновский ?
В ардуино мониторе проверьте настройки порта, чтобы они совпадали с настройками Сериал в скетче. Квадратики - это признак неправильной скорости порта
В Ардуино ИДЕ подключенная Уно определяется именно на порту COM1 ?
Смотрю COM1.
Если "ардуиновский" - имеется в виду тот, который появляется при подключении Ардуино по USB, то провод отключён. Ардуино запитана блоком питания и подключена исключительно через пины 0 и 1 на COM1 компа.
В настройках монитора порта в выпадающем списке указано 9600.
А вот с определением Ардуино обстоит дело так. Когда я подключаю её по USB, то в IDE она показывается на COM5 и подписывается, что это она - Ардуино УНО. Когда же подключаю по COM1, то ничего не показывается. Просто в IDE выбираю порт в меню.
Может, в этом загвоздка? У меня она подключена всего тремя проводочками - RX, TX и земля.
Более того, когда экспериментировали с передачай того же байта по проводу USB, то никаких проблем не было. Ловился посылаемый байт и ничего лишнего.
по COM5 данные нормально идут в мониторе порта ?
Исключительно? А если так попробовать:
COM1 Tx = UNO Rx, Rx = Tx, Gnd = Gnd, Cts = Gnd, Dtr = Reset
А если так попробовать:
COM1 Tx = UNO Rx, Rx = Tx, Gnd = Gnd, Cts = Gnd, Dtr = Reset
Вот попробую сейчас. И отпишусь, разумеется.
forester_xiii, что ж вы всем голову морочите???
Подключите Уно через USB, выберите порт COM5 - и у вас все заработает
Если бы было всё так просто, то не морочил бы голову никому. :)
Надо именно по COM, требование такое. :(
forester_xii, если вы берете "настоящий" КОМ-порт, то там же уровни сигналов совсем другие, чем в Ардуине. В частности. там используются отрицательные напряжения, если мне не изменяет память.
Напрямую подключать нельзя, нужен конвертер сигнала RS232 (ИМХО)
только хотел сказать, ща докатимся до
Необходим конвертор без сомнений. MAX232.
Спасибо, народ!
Как ни странно, стало понятнее. Буду копать в эту сторону.
Полагаю, нет необходимости рассказывать, что подключение Cts и Dtr ничуть не помогло.
forester_xiii,
по-моему, стандарт RS232, которому должен соответствовать COM порт компьютера, допускает использование напряжений -15 .. +15 вольт. То есть, в вашем случае, порты Tx и Rx микроконтроллера могли быть повреждены, так как они рассчитаны толтко на напряжение 0..+5 вольт, и ограничение по силе тока есть.
зачем человека пугать, через дунькин USB-USART (com5) у него все нормально, значит и порты живы.