#1 Програмування Arduino » Arduino Uno, передача данных по COM-порту, "искривляются" байты » 2018-07-30 17:47:43

Forester_xiii
відповідей: 4

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

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

Помогите понять, что я делаю не так?  sad

Підвал форуму