COM vs 74HC595 - нужна помощь

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пн авг 22, 2011 16:26:55
Откуда: Одесса

Сообщение Arey0 »

Нужна помощь в таком вопросе.

Первоначальная задача: Управление нагрузками с помощью ПК.

Так как LPT совсем уж древний порт (темболее он у меня занят другим девайсом) ) решил использовать COM порт (USB конечно лучше но решил начать с более простого + задача довольно простая чтобы задействовать USB). Как конечный элемент управления использую сдвиговый регистр 74HC595 (первоначально необходимо управлять 5 нагрузками, однако думаю этим дело не кончиться) ). Для управления этим регистром необходимо 3 сигнала (дата\синхро\защелка). С COM порта у меня получилось управлять ножками DTR и RTS, а вот чтобы задействовать RxD (хотябы для защелки) у меня ничего не получаеться(

ПО пишу в C++Builder 2010, причем использую готовую форму взятую отсюда http://vasyast1m.blogspot.com/2011/03/c ... ilder.html

В интернете находил готовые примеры такого управления (например тут: http://www.labkit.ru/html/autocontrol?id=136), но без каких либо описаний их програмной реализации.

P.S.: Программа в любом случае нужна своя так как помимо включения нагрузок еще должны выполняться определенные действия в системе (например проигрывание звукового сопровождения).
P.S.: Помогите начинающему котенку :)) :solder:
Реклама
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

манипулировать RxD у вас и не получится - это ВХОД, нет возможности менять на нем уровень программно. есть возможность управлять уровнем TxD - но очень медленно по сравнению с остальными.
смотрите в сторону функций WinAPI SetCommBreak и ClearCommBreak
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пн авг 22, 2011 16:26:55
Откуда: Одесса

Сообщение Arey0 »

А что указывать в параметре функции вместо HANDLE hFile?
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

Arey0 писал(а):А что указывать в параметре функции вместо HANDLE hFile?
даже интересно, как вы умудряетесь оперировать RTS и DTR, не зная дескриптора открытого СОМ-порта?!
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3385
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Arey0 писал(а):USB конечно лучше но решил начать с более простого
Да нет там ничего сложного.
Читаем http://www.radioman-portal.ru/pages/1698/index.shtml
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пн авг 22, 2011 16:26:55
Откуда: Одесса

Сообщение Arey0 »

Мастер Ломастер писал(а):
Arey0 писал(а):А что указывать в параметре функции вместо HANDLE hFile?
даже интересно, как вы умудряетесь оперировать RTS и DTR, не зная дескриптора открытого СОМ-порта?!
Очень просто, я же написал, я использую уже готовый компонент который встроил в оболочку (http://vasyast1m.blogspot.com/2011/03/c ... ilder.html). При этом код выглядит примерно так:

Код: Выделить всё

__fastcall TForm2::TForm2(TComponent* Owner)
	: TForm(Owner)
{
CommPort1->ComNumber = 1;
CommPort1->Open = true;
}

void __fastcall TForm2::Button4Click(TObject *Sender)
{
CommPort1->RTS = true;
Sleep(100);
CommPort1->RTS = false;
Sleep(100);
CommPort1->RTS = true;
Sleep(100);
CommPort1->RTS = false;
Sleep(100);
CommPort1->RTS = true;
Sleep(100);
CommPort1->RTS = false;
Sleep(100);
CommPort1->RTS = true;
Sleep(100);
CommPort1->RTS = false;
}

void __fastcall TForm2::BitBtn1Click(TObject *Sender)
{
CommPort1->ComNumber = 1;
CommPort1->Open = false;
Close();
}
Просто познания языка ограничиваються Борландом, а в современных оболочка доступна такая штука как объектно-ориентированное программирование). Поэтому и прошу помощи, как в этом разобраться)
Реклама
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

Arey0 писал(а):Просто познания языка ограничиваються Борландом, а в современных оболочка доступна такая штука как объектно-ориентированное программирование
язык работает по командам из мозга. если языку нечего сказать - он не виноват, это мозг гладкий.
думаю, ООП для вас - пустой звук, не оправдание.
все, что необходимо для управления линиями СОМ-порта детально описано в справке от Борландовского компилятора (WinAPI), конкретную функцию для управления TxD я вам указал, остальное - в доках.
успехов!
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пн авг 22, 2011 16:26:55
Откуда: Одесса

Сообщение Arey0 »

Проблема в том что я пытаюсь работать с компонентом (дополнительно встроенным в буилдер) в котором нету действия которое мне нужно. В файлах самого компонента нашол такие строчки:

Код: Выделить всё

// функцыя открытия порта:

void __fastcall TCommPort::OpenPort(void)
{
  if( FOpen )  return;

  IBuffUsed = 0;
  OBuffUsed = 0;

  OBuffer = new unsigned char[OBuffSize];
  IBuffer = new unsigned char[IBuffSize];
  SetLastError(0); //remove any pending errors

  AnsiString DeviceName = AnsiString("\\\\.\\COM") + IntToStr(FComNumber);
  FComHandle = CreateFile( DeviceName.c_str(),
                           GENERIC_READ | GENERIC_WRITE,
                           0, NULL,
                           OPEN_EXISTING,
                           FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 0);
//...и т.д.

// И нашол функцию которую пытался  непосредственно использовать сам в своем коде(и которая не работает). Сдесь она выглядит так:

void __fastcall TCommPort::PowerOn(void)
{
  EscapeCommFunction( FComHandle, SETDTR );
  EscapeCommFunction( FComHandle, SETRTS );
  FRTS = true;
  FDTR = true;
}

//---------------------------------------------------------------------------
void __fastcall TCommPort::PowerOff(void)
{
  EscapeCommFunction( FComHandle, CLRDTR );
  EscapeCommFunction( FComHandle, CLRRTS );
  FRTS = false;
  FDTR = false;
}
Как видно в самом файле объекта этой функции прописано управление только двумя компонентама: DTR и RTS.

В своей программе я пытался ее вызвать так:

Код: Выделить всё

EscapeCommFunction(FComHandle,SETDTR);
На что компилятор ругается на неизвестный символ FComHandle. По видимому он не являеться глобальным для всего проэкта.. Хотя странно - как же тогда компонент открывает порт?

Вобщем подскажите можно ли как то указать на этот дескрипт в компоненте? Или же выкинуть его вообще и писать обычным кодом :( Хотел упростить написание кода, а получилось вернулся к старому :) :(
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

я вам намекал, но вы не поняли... говорю открытым текстом: чтобы работать с компонентами надо понимать, как они устроены. если вам хватает возможностей имеющегося компонента, то думать почти не надо. а вот если не хватает, то есть три пути:
1. искать готовый новый компонент с теми возможностями, которых не хватает.
2. если есть исходник - изменить его под свои нужды и получить самостоятельно сделанный компонент с нужными возможностями.
3. отказаться от компонента и работать с WinAPI напрямую.

как вы догадываетесь, только первый путь не потребует от вас напряжения извилин. а в остальных случаях прежде придется серьезно изучить ООП и VCL в частности, заодно возможности IDE по компиляции компонентов. для третьего варианта придется почитать справочные файлы по WinAPI - там очень много интересного написано.

P.S. если вы не в курсе, то FComHandle - это внутреннее (private) свойство вашего компонента, и работать напрямую с этим свойством вы не сможете никогда - только изнутри компонента.
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пн авг 22, 2011 16:26:55
Откуда: Одесса

Сообщение Arey0 »

Мастер Ломастер писал(а):P.S. если вы не в курсе, то FComHandle - это внутреннее (private) свойство вашего компонента, и работать напрямую с этим свойством вы не сможете никогда - только изнутри компонента.
Вот собственно в где и была "собака зарыта") Проблему уже решил используя непосредственный код (ваш 3й вариант). Выглядит это примерно так:

Код: Выделить всё

TForm2 *Form2;
HANDLE port;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
	: TForm(Owner)
{
port = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE,
                0, NULL, OPEN_EXISTING, 0, NULL);
//<настройка порта>
//<чтение/запись>
}

void __fastcall TForm2::Button1Click(TObject *Sender)
{
EscapeCommFunction(port,CLRDTR);
}

void __fastcall TForm2::Button2Click(TObject *Sender)
{
EscapeCommFunction(port,SETDTR);
}

void __fastcall TForm2::Button3Click(TObject *Sender)
{
EscapeCommFunction(port,CLRRTS);
}

void __fastcall TForm2::Button4Click(TObject *Sender)
{
EscapeCommFunction(port,SETRTS);
}

void __fastcall TForm2::BitBtn1Click(TObject *Sender)
{
CloseHandle(port);
Close();
}

void __fastcall TForm2::SpeedButton1Click(TObject *Sender)
{
//EscapeCommFunction(port,SETBREAK);
SetCommBreak(port);
}

void __fastcall TForm2::SpeedButton2Click(TObject *Sender)
{
//EscapeCommFunction(port,CLRRTS);
ClearCommBreak(port);
}
Осталось доработать код и привести к нужному виду :)
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

осмелюсь напомнить несколько моментов:
1. для программного дрыгания линиями порта не нужно производить какие-либо настройки (в смысле скорость, четность и т.п.)
2. не забывайте, что в реальной системе COM-порты могут иметь имена совсем не похожие на COM с циферкой.
3. "виртуальные" СОМ-порты, получаемые при помощи USB-переходников могут не отрабатывать смену уровней так, как вам надо, но это уже от самого переходника зависит.
4. для нормальной работы нужно уметь узнавать список всех СОМ-портов, доступных в системе и предлагать выбор из этого списка
5. не забудьте проверить получаемый дескриптор на корректность - порт ведь может и не открыться функцией CreateFile
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 21
Зарегистрирован: Пн авг 22, 2011 16:26:55
Откуда: Одесса

Сообщение Arey0 »

Мастер Ломастер писал(а):осмелюсь напомнить несколько моментов:
1. для программного дрыгания линиями порта не нужно производить какие-либо настройки (в смысле скорость, четность и т.п.)
2. не забывайте, что в реальной системе COM-порты могут иметь имена совсем не похожие на COM с циферкой.
3. "виртуальные" СОМ-порты, получаемые при помощи USB-переходников могут не отрабатывать смену уровней так, как вам надо, но это уже от самого переходника зависит.
4. для нормальной работы нужно уметь узнавать список всех СОМ-портов, доступных в системе и предлагать выбор из этого списка
5. не забудьте проверить получаемый дескриптор на корректность - порт ведь может и не открыться функцией CreateFile
Конечно же и выбор номера порта, и проверка доступных портов, и проверка корректности выполнения программы, все это будет). Проблема была связать програмные действия с аппаратными, и все получилось.
Единственное, конечно, смущает что для согласования уровней RS и TTL я использовал MAX232 у которой только по 2 канала RS => TTL и TTL => RS, а в моем случае нужно 3. Вот и думаю либо купить еще 1 микросхему, либо просто поставить 3 стабилитрона на 5.1В ... =\
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город

Сообщение Мастер Ломастер »

почти во всех случаях "согласование" уровней можно сделать при помощи обычного резистора, как это сделано в большинстве примитивных программаторов для AVR
битва с дураками проиграна, победители торжествуют. слава победителям!
Контактная информация:
Ответить

Вернуться в «Интеграция с ПК»