Arduino Uno, передача данных по COM-порту, "искривляются" байты

forester_xiii
Offline
Зарегистрирован: 30.07.2018
Доброго времени суток.
 
Совершеннейший новичок, пишу первый скетч для 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();                       //вызываем функцию для вывода данных на экран и в файл
        }
       }
    }
  }
}

 

 
Помогите понять, что я делаю не так?  :(
xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

forester_xiii пишет:

Ардуиновский монитор порта вообще выдаёт непрерывную строку квадратиков без задержки.

скорость в мониторе порта ?

forester_xiii
Offline
Зарегистрирован: 30.07.2018

Те же 9600, как и в скетче.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

порт смотрите какой, com1 или ардуиновский ?

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

В ардуино мониторе проверьте настройки порта, чтобы они совпадали с настройками Сериал в скетче. Квадратики - это признак неправильной скорости порта

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

В Ардуино ИДЕ подключенная Уно определяется именно на порту COM1 ?

forester_xiii
Offline
Зарегистрирован: 30.07.2018

Смотрю COM1.

Если "ардуиновский" - имеется в виду тот, который появляется при подключении Ардуино по USB, то провод отключён. Ардуино запитана блоком питания и подключена исключительно через пины 0 и 1 на COM1 компа.

forester_xiii
Offline
Зарегистрирован: 30.07.2018

В настройках монитора порта в выпадающем списке указано 9600. 

А вот с определением Ардуино обстоит дело так. Когда я подключаю её по USB, то в IDE она показывается на COM5 и подписывается, что это она - Ардуино УНО. Когда же подключаю по COM1, то ничего не показывается. Просто в IDE выбираю порт в меню.

Может, в этом загвоздка? У меня она подключена всего тремя проводочками -  RX, TX и земля.

Более того, когда экспериментировали с передачай того же байта по проводу USB, то никаких проблем не было. Ловился посылаемый байт и ничего лишнего.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

по COM5 данные нормально идут в мониторе порта ?

negavoid
Offline
Зарегистрирован: 09.07.2016

forester_xiii пишет:
подключена исключительно через пины 0 и 1 на COM1 компа.

Исключительно? А если так попробовать:

COM1 Tx = UNO Rx, Rx = Tx, Gnd = Gnd, Cts = Gnd, Dtr = Reset

 

forester_xiii
Offline
Зарегистрирован: 30.07.2018

negavoid пишет:

А если так попробовать:

COM1 Tx = UNO Rx, Rx = Tx, Gnd = Gnd, Cts = Gnd, Dtr = Reset

 

Вот попробую сейчас. И отпишусь, разумеется.

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

forester_xiii, что ж вы всем голову морочите???

Подключите Уно через USB, выберите порт COM5 - и у вас все заработает

 

forester_xiii
Offline
Зарегистрирован: 30.07.2018

Если бы было всё так просто, то не морочил бы голову никому. :)
Надо именно по COM, требование такое. :(

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

forester_xii, если вы берете "настоящий" КОМ-порт, то там же уровни сигналов совсем другие, чем в Ардуине. В частности. там используются отрицательные напряжения, если мне не изменяет память.

Напрямую подключать нельзя, нужен конвертер сигнала RS232 (ИМХО)

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

только хотел сказать, ща докатимся до

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

Необходим конвертор без сомнений. MAX232.

forester_xiii
Offline
Зарегистрирован: 30.07.2018

Спасибо, народ!
Как ни странно, стало понятнее. Буду копать в эту сторону.

Полагаю, нет необходимости рассказывать, что подключение Cts и Dtr ничуть не помогло.

toc
Offline
Зарегистрирован: 09.02.2013

forester_xiii,
по-моему, стандарт RS232, которому должен соответствовать COM порт компьютера, допускает использование напряжений -15 .. +15 вольт. То есть, в вашем случае, порты Tx и Rx микроконтроллера могли быть повреждены, так как они рассчитаны толтко на напряжение 0..+5 вольт, и ограничение по силе тока есть.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

toc пишет:
forester_xiii, по-моему, стандарт RS232, которому должен соответствовать COM порт компьютера, допускает использование напряжений -15 .. +15 вольт. То есть, в вашем случае, порты Tx и Rx микроконтроллера могли быть повреждены, так как они рассчитаны толтко на напряжение 0..+5 вольт, и ограничение по силе тока есть.

зачем человека пугать, через дунькин USB-USART (com5) у него все нормально, значит и порты живы.