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

Тема в разделе "Arduino & Shields", создана пользователем forester_xiii, 30 июл 2018.

  1. forester_xiii

    forester_xiii Нуб

    Доброго времени суток.

    Совершеннейший новичок, пишу первый скетч для Arduino Uno. Необходимо, чтобы Ардуино передавала байты, а программа на компе ловила их. Ардуино подключена на встроенный порт компа COM1 пинами 0 и 1, земля на соответствующем пине.

    Проблема в следующем. Для теста Ардуино каждые две с половиной секунды отправляет один и тот же байт - 65 (латинская A).

    На компе написаны две проги - на Дельфи и на Си++. Делфовская каждые две секунды принимает по очереди два байта - 250 и 95. Сишная прога принимает один раз в произвольное время разное количество разных байтов, всё остальное время принимает нулевые байты.

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


    Вот скетч:

    Код (Text):

    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);
    }
     

    Процедура приёма данных на Си++

    Код (Text):

    //главная функция потока, реализует приём байтов из 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();                             //вызываем функцию для вывода данных на экран и в файл
            }
           }
        }
      }
    }
     

    Помогите понять, что я делаю не так? :(
     
  2. Daniil

    Daniil Гуру

    ммм...давайте попробуем разобраться с настройками в ардиуно иде (delphi и си нас пока не интересуют). Там выставлена скорость 9600?
    изменится что-нибудь если напишите serial.print("A") или serial.print(0x65).
    обратите внимание, что есть print, а есть write.
     
    Airbus нравится это.
  3. Airbus

    Airbus Радиохулиган Модератор

    И зачем изйопства?Когда можно передать просто то что надо?А русскую или нерусскую?И скорость проверьте скорость а скетче равна скорости а порту
     
  4. b707

    b707 Гуру

    все уже решили на другом форуме. ТС просто пытался подключить RX TX ардуины прямо к "железному" COM-порту, без USB и каких-либо переходников
     
    arkadyf и Daniil нравится это.
  5. msd

    msd Нерд

    Это сильно! Так и ардуину "искривить" недолго.