Страница 1 из 1
COM vs 74HC595 - нужна помощь
Добавлено: Пн авг 22, 2011 16:53:34
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.: Помогите начинающему котенку

Re: COM vs 74HC595 - нужна помощь
Добавлено: Пн авг 22, 2011 17:13:51
Мастер Ломастер
манипулировать RxD у вас и не получится - это ВХОД, нет возможности менять на нем уровень программно. есть возможность управлять уровнем TxD - но очень медленно по сравнению с остальными.
смотрите в сторону функций WinAPI SetCommBreak и ClearCommBreak
Re: COM vs 74HC595 - нужна помощь
Добавлено: Пн авг 22, 2011 19:17:49
Arey0
А что указывать в параметре функции вместо HANDLE hFile?
Re: COM vs 74HC595 - нужна помощь
Добавлено: Пн авг 22, 2011 19:48:03
Мастер Ломастер
Arey0 писал(а):А что указывать в параметре функции вместо HANDLE hFile?
даже интересно, как вы умудряетесь оперировать
RTS и
DTR, не зная дескриптора открытого СОМ-порта?!
Re: COM vs 74HC595 - нужна помощь
Добавлено: Пн авг 22, 2011 21:16:13
Мурик
Arey0 писал(а):USB конечно лучше но решил начать с более простого
Да нет там ничего сложного.
Читаем
http://www.radioman-portal.ru/pages/1698/index.shtml
Re: COM vs 74HC595 - нужна помощь
Добавлено: Вт авг 23, 2011 12:47:02
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();
}
Просто познания языка ограничиваються Борландом, а в современных оболочка доступна такая штука как объектно-ориентированное программирование). Поэтому и прошу помощи, как в этом разобраться)
Re: COM vs 74HC595 - нужна помощь
Добавлено: Вт авг 23, 2011 13:26:14
Мастер Ломастер
Arey0 писал(а):Просто познания языка ограничиваються Борландом, а в современных оболочка доступна такая штука как объектно-ориентированное программирование
язык работает по командам из мозга. если языку нечего сказать - он не виноват, это мозг гладкий.
думаю, ООП для вас - пустой звук, не оправдание.
все, что необходимо для управления линиями СОМ-порта детально описано в справке от Борландовского компилятора (WinAPI), конкретную функцию для управления TxD я вам указал, остальное - в доках.
успехов!
Re: COM vs 74HC595 - нужна помощь
Добавлено: Вт авг 23, 2011 14:18:57
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.
В своей программе я пытался ее вызвать так:
На что компилятор ругается на неизвестный символ FComHandle. По видимому он не являеться глобальным для всего проэкта.. Хотя странно - как же тогда компонент открывает порт?
Вобщем подскажите можно ли как то указать на этот дескрипт в компоненте? Или же выкинуть его вообще и писать обычным кодом

Хотел упростить написание кода, а получилось вернулся к старому

Re: COM vs 74HC595 - нужна помощь
Добавлено: Вт авг 23, 2011 16:09:35
Мастер Ломастер
я вам намекал, но вы не поняли... говорю открытым текстом: чтобы работать с компонентами надо понимать, как они устроены. если вам хватает возможностей имеющегося компонента, то думать почти не надо. а вот если не хватает, то есть три пути:
1. искать готовый новый компонент с теми возможностями, которых не хватает.
2. если есть исходник - изменить его под свои нужды и получить самостоятельно сделанный компонент с нужными возможностями.
3. отказаться от компонента и работать с WinAPI напрямую.
как вы догадываетесь, только первый путь не потребует от вас напряжения извилин. а в остальных случаях прежде придется серьезно изучить ООП и VCL в частности, заодно возможности IDE по компиляции компонентов. для третьего варианта придется почитать справочные файлы по WinAPI - там очень много интересного написано.
P.S. если вы не в курсе, то FComHandle - это внутреннее (private) свойство вашего компонента, и работать напрямую с этим свойством вы не сможете никогда - только изнутри компонента.
Re: COM vs 74HC595 - нужна помощь
Добавлено: Вт авг 23, 2011 16:33:31
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);
}
Осталось доработать код и привести к нужному виду

Re: COM vs 74HC595 - нужна помощь
Добавлено: Вт авг 23, 2011 18:57:10
Мастер Ломастер
осмелюсь напомнить несколько моментов:
1. для программного дрыгания линиями порта не нужно производить какие-либо настройки (в смысле скорость, четность и т.п.)
2. не забывайте, что в реальной системе COM-порты могут иметь имена совсем не похожие на COM с циферкой.
3. "виртуальные" СОМ-порты, получаемые при помощи USB-переходников могут не отрабатывать смену уровней так, как вам надо, но это уже от самого переходника зависит.
4. для нормальной работы нужно уметь узнавать список всех СОМ-портов, доступных в системе и предлагать выбор из этого списка
5. не забудьте проверить получаемый дескриптор на корректность - порт ведь может и не открыться функцией CreateFile
Re: COM vs 74HC595 - нужна помощь
Добавлено: Вт авг 23, 2011 19:41:36
Arey0
Мастер Ломастер писал(а):осмелюсь напомнить несколько моментов:
1. для программного дрыгания линиями порта не нужно производить какие-либо настройки (в смысле скорость, четность и т.п.)
2. не забывайте, что в реальной системе COM-порты могут иметь имена совсем не похожие на COM с циферкой.
3. "виртуальные" СОМ-порты, получаемые при помощи USB-переходников могут не отрабатывать смену уровней так, как вам надо, но это уже от самого переходника зависит.
4. для нормальной работы нужно уметь узнавать список всех СОМ-портов, доступных в системе и предлагать выбор из этого списка
5. не забудьте проверить получаемый дескриптор на корректность - порт ведь может и не открыться функцией CreateFile
Конечно же и выбор номера порта, и проверка доступных портов, и проверка корректности выполнения программы, все это будет). Проблема была связать програмные действия с аппаратными, и все получилось.
Единственное, конечно, смущает что для согласования уровней RS и TTL я использовал MAX232 у которой только по 2 канала RS => TTL и TTL => RS, а в моем случае нужно 3. Вот и думаю либо купить еще 1 микросхему, либо просто поставить 3 стабилитрона на 5.1В ... =\
Re: COM vs 74HC595 - нужна помощь
Добавлено: Ср авг 24, 2011 15:29:43
Мастер Ломастер
почти во всех случаях "согласование" уровней можно сделать при помощи обычного резистора, как это сделано в большинстве примитивных программаторов для AVR