Доброго времени суток. Совершеннейший новичок, пишу первый скетч для 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(); //вызываем функцию для вывода данных на экран и в файл } } } } } Помогите понять, что я делаю не так?
ммм...давайте попробуем разобраться с настройками в ардиуно иде (delphi и си нас пока не интересуют). Там выставлена скорость 9600? изменится что-нибудь если напишите serial.print("A") или serial.print(0x65). обратите внимание, что есть print, а есть write.
И зачем изйопства?Когда можно передать просто то что надо?А русскую или нерусскую?И скорость проверьте скорость а скетче равна скорости а порту
все уже решили на другом форуме. ТС просто пытался подключить RX TX ардуины прямо к "железному" COM-порту, без USB и каких-либо переходников