#1 2018-07-30 17:47:43

Forester_xiii
Учасник
Зареєстрований: 2018-07-30
Повідомлень: 1

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

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

Совершеннейший новичок, пишу первый скетч для 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

Неактивний

#2 2018-07-30 21:14:36

Kaka
Учасник
Зареєстрований: 2018-03-21
Повідомлень: 411

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

Ахренеть,

тебе же уже сказали, что у RS-232 (ком-порта) и ардуиновского UART разные уровни и протоколы. Нельзя тупо соединять ардуиновские RX/TX с ком-портом, нужен преобразователь типа MAX232.

Ты не поверил? Решил, что здесь тебе другое скажут? smile)))

Неактивний

#3 2018-08-02 15:49:31

theoristos
Учасник
Зареєстрований: 2018-08-02
Повідомлень: 26

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

Forester_xiii: гм, если у вас UNO, то должен быть виртуальным ком-порт, проброшенный через USB. Подключайте, задавайте в программе нужный номер и спокойно отлаживайте.

А так даже непонятно куда вы эти пины вставили, 10 лет не видел компа со встроенным комом.
(если порт "настоящий", то без согласования уровней кроме вреда ничего не получится)

Неактивний

#4 2018-08-02 23:29:06

LynX
Учасник
Зареєстрований: 2018-04-19
Повідомлень: 71

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

В LPT надо было. Резисторов еще для безопасности, как обычно. (Я шучу, но да, можно, но ПО будете писать сами.)

10 лет не видел компа со встроенным комом.

google промышленный комьютер Найдите тут компьютер без COM порта.

Неактивний

#5 2018-08-03 20:50:23

theoristos
Учасник
Зареєстрований: 2018-08-02
Повідомлень: 26

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

LynX пише:

google промышленный комьютер Найдите тут компьютер без COM порта.

Ну, приносите. Посмотрю.

ps: слыхал, бывают с одними 485-ыми, без 232-ых.

Остання редакція theoristos (2018-08-03 20:51:25)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

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