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