Ви не увійшли.
Доброго времени суток.
Совершеннейший новичок, пишу первый скетч для 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(); //вызываем функцию для вывода данных на экран и в файл
}
}
}
}
}
Помогите понять, что я делаю не так?
Неактивний
Ахренеть,
тебе же уже сказали, что у RS-232 (ком-порта) и ардуиновского UART разные уровни и протоколы. Нельзя тупо соединять ардуиновские RX/TX с ком-портом, нужен преобразователь типа MAX232.
Ты не поверил? Решил, что здесь тебе другое скажут? )))
Неактивний
Forester_xiii: гм, если у вас UNO, то должен быть виртуальным ком-порт, проброшенный через USB. Подключайте, задавайте в программе нужный номер и спокойно отлаживайте.
А так даже непонятно куда вы эти пины вставили, 10 лет не видел компа со встроенным комом.
(если порт "настоящий", то без согласования уровней кроме вреда ничего не получится)
Неактивний
В LPT надо было. Резисторов еще для безопасности, как обычно. (Я шучу, но да, можно, но ПО будете писать сами.)
10 лет не видел компа со встроенным комом.
google промышленный комьютер Найдите тут компьютер без COM порта.
Неактивний
google промышленный комьютер Найдите тут компьютер без COM порта.
Ну, приносите. Посмотрю.
ps: слыхал, бывают с одними 485-ыми, без 232-ых.
Остання редакція theoristos (2018-08-03 20:51:25)
Неактивний