Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > питания для com порта


Автор: R0nin 30.9.2005, 01:51
Я спаял устройство работающее от питания com порта, нада прога для выключения устройства! Тоесть что бы на 1 контакт перестал подоваться напряг. smile
В этом я профан, может кто придумает как енто зделать!

Автор: Mad 30.9.2005, 02:08
R0nin
А с какого сигнала ты береш питание ?

Автор: Romikgy 30.9.2005, 13:10
А какая система????

Автор: R0nin 1.10.2005, 01:16
вобщем принцип такой:
я взял провод от мыша комовского там было 4 провода я взял белый- smile и синий плюс+
нада чтоб один из них перестал по команде функционировать! smile

Автор: Mad 1.10.2005, 12:54
Цитата(R0nin @ 1.10.2005, 00:16)
я взял провод от мыша комовского там было 4 провода я взял белый-  и синий плюс+
нада чтоб один из них перестал по команде функционировать!

вообщето они могут полярность и поменять (в процесе работы с портом какойто проги) smile

Автор: R0nin 2.10.2005, 01:04
пусть меняют, но только по команде!
в устройстве диоды от него питаются, так что при смене полярности эффект тот же: ВЫКЛЮЧЕНИЕ !

Автор: Romikgy 3.10.2005, 09:30
Не знаю, мышь никогда сом-скую никогда не разбирал smile , но попробуй поигратся с лапами ком порта :
DTR, DSR, RTS, CTS,
если конечно ты не прицепился к данным .

Автор: R0nin 4.10.2005, 01:54
Я бы поигрался smile , НО не имею понятия как и с чем smile
Я понимаю лишь тот ффакт что мне надо обесточить ком порт, и это должна сделать программа!
smile Хотелось бы приме того как еенто можно осуществить! smile

Автор: ShadeSt 4.10.2005, 09:04
У ком порта как такового питания нет, есть только сигнальные выводы, из них имеется например DTR (4) и RTS (7), которыми можно управлять и на которых можно выставить "0" или "1". уровни сигналов -12 и +12 вольт (максимум). Сигнальные выводы RX, TX инвертированны, т.е. -12в. соответствует "1", насчет DTR и DSR не знаю. в твоем случае надо повесить устройство на 5й - GND и 4 - DTR выводы через диод, чтобы не спалить его(хотя, насколько я понял так и сделано), и играться DTR'ом. Я это делал через компонент для дельфи, который нашел в интернете, цели написать свой компонент не было. Насколько я понимаю копать надо в сторону GetCommState,SetCommState - "Communication Functions" в Help\Windows SDK\Find

Автор: Romikgy 4.10.2005, 11:07
Попробуй поигратся с этим:
Цитата

The EscapeCommFunction function directs a specified communications device to perform an extended function.

BOOL EscapeCommFunction(

    HANDLE hFile, // handle to communications device
    DWORD dwFunc  // extended function to perform
  );


Parameters

hFile

Identifies the communications device. The CreateFile function returns this handle.

dwFunc

Specifies the code of the extended function to perform. This parameter can be one of the following values:

Value Meaning
CLRDTR Clears the DTR (data-terminal-ready) signal.
CLRRTS Clears the RTS (request-to-send) signal.
SETDTR Sends the DTR (data-terminal-ready) signal.
SETRTS Sends the RTS (request-to-send) signal.
SETXOFF Causes transmission to act as if an XOFF character has been received.
SETXON Causes transmission to act as if an XON character has been received.
SETBREAK Suspends character transmission and places the transmission line in a break state until the ClearCommBreak function is called (or EscapeCommFunction is called with the CLRBREAK extended function code). The SETBREAK extended function code is identical to the SetCommBreak function. Note that this extended function does not flush data that has not been transmitted.
CLRBREAK Restores character transmission and places the transmission line in a nonbreak state. The CLRBREAK extended function code is identical to the ClearCommBreak function.


Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

Добавлено @ 11:09
Цитата(ShadeSt @ 4.10.2005, 09:04)
надо повесить устройство на 5й - GND и 4 - DTR выводы через диод, чтобы не спалить его(хотя, насколько я понял так и сделано), и играться DTR'ом

+верхнее (тобишь там ф-ция, для того как игратся)
smile

Автор: cardinal 5.10.2005, 01:33
А что городишь-то такое? smile

Автор: R0nin 5.10.2005, 23:38
коврик с подсветкой!
Люди, если не лень поногите начинающему!
Напишите примерный исходник, что бы было с чем разбираться!
А то это ля меня все страшно очень!

Автор: cardinal 6.10.2005, 01:57
Как написать работающий пример, если "прибор" у тебя? Тестировать не на чем! Соответственно даже не знаю что предложить, но... использовать то, что для этого не предназначено это не лучший вариант. Боюсь, что кончится все тем, что у тебя чего-нибудь сгорит (плата в компе например) из-за того, что ты не очень представляешь, что делаешь. smile (без обид, сам таким был и есть smile)
Я знаю, что с USB ты можешь получить источник питания (USB хоть предусматривает питание внешнего устройства с малым потреблением тока), но как включить/выключить это дело по простому я не представляю...

Мысля есть, но...

Почитай про то, что происходит при передачи данных через com порт пока...

Автор: ShadeSt 6.10.2005, 07:38
USB это хорошо, но оччень геморойно, на сколько я знаю. выключать питание там нужно будет контроллером, который будет общатся с компом, на котором нужно будет писать дрова под свой девайс. по моему так. А на счет питания с ком порта все проще, по принципу который описывали выше работают все датакабели "компорт - телефон" у них там MAX232 стоит, и питание на него примерно так же подается, через диодики.
Можно скачать программу(например Terminal RS-232C http://bsalab.ruweb.net/ru/downloads.htm), которая умеет управлять DTR, отладить железо, а потом написать свою программу.

Автор: Romikgy 6.10.2005, 09:25
Ну в МАХ питание не совсем через диодики подается, А во вторых тебе нужно только DTR Управлять?

Автор: cardinal 6.10.2005, 12:25
ShadeSt, не знаешь ли ты такого терминала, чтобы

Цитата
Чтоб я мог вызывать ее из комадной строки, типа

terminal.exe -sendmode hex -send 0F 5A FE
или
terminal.exe -sendmode char -send A B C D E

И чтобы она, разумеется, не появлялась формой, а там в командной строке работала и завершалась.

Автор: R0nin 6.10.2005, 23:47
to cardinal там напряга в том ковре не столько чтобы чтото сгорело! smile
По началу была мысля сделать с USB но нашел только COM шнур! smile
о что сделано то сделано!
Цитата
Как написать работающий пример, если "прибор" у тебя?
заставить перестать пахать любое сом устройство smile методами представлеными выше, ну или еще как! smile
Добавлено @ 23:51
to ShadeSt ЩАс скачаю прогу попробую ею!

Автор: R0nin 7.10.2005, 00:10
В общем, при установки галочьки на управление RTS коврик тухнет smile !
То что доктор прописал!
но вопрос тот же, как сие осуществить в DElphi?

Автор: cardinal 7.10.2005, 00:32
Цитата(R0nin @ 6.10.2005, 22:10)
В общем, при установки галочьки на управление RTS коврик тухнет

Интересно почему... smile

Ну тогда разбирайся с функцией, которую тебе посоветовали:
http://forum.vingrad.ru/index.php?showtopic=65924&view=findpost&p=530564
В Delphi я тебе не помощник...

Автор: ShadeSt 7.10.2005, 07:45
Тухнет потому, что галочка провод передавливает smile
To Cardinal. Нет такой терминалки не встречал, Может потому что никогда не было такой задачи.

Автор: ~FoX~ 7.10.2005, 07:56
Товарисчи, питалово ком порта не управляется программно.

Автор: Guest 7.10.2005, 08:28
Ну так у ком порта вообще нет вывода питания наружу у него только сигнальные и земля. тут же речь уже идет о том что питание устройства подвешенного к ком порту, осуществляется посредством установления +12 вольт или "низкого уровня" на сигнальном выводе DTR.

Автор: ShadeSt 7.10.2005, 08:32
Точнее, простите, RTS. ошибся

Автор: Romikgy 7.10.2005, 13:41
Вот код для работы с портом:
Код

unit Unit1; 

interface 

uses 
  Windows; 

type 
  TComPort = class 
  private 
    hFile: THandle; 
  public 
    constructor Create; 
    destructor Destroy; override; 
    function InitCom(BaudRate, PortNo: Integer; Parity: Char; 
      CommTimeOuts: TCommTimeouts): Boolean; 
    procedure CloseCom; 
    function ReceiveCom(var Buffer; Size: DWORD): Integer; 
    function SendCom(var Buffer; Size: DWORD): Integer; 
    function ClearInputCom: Boolean; 
  end; 

implementation 

uses 
  SysUtils; 

constructor TComPort.Create; 
begin 
  inherited; 
  InitCom; 
end; 

destructor TComPort.Destroy; 
begin 
  CloseCom; 
  inherited; 
end; 

function TComPort.InitCom(BaudRate, PortNo: Integer; Parity: Char; 
  CommTimeOuts: TCommTimeouts): Boolean; 
var 
  FileName: string; 
  DCB: TDCB; 
  PortParam: string; 
begin 
  result := FALSE; 
  FileName := 'Com' + IntToStr(PortNo); {имя файла} 
  hFile := CreateFile(PChar(FileName), 
    GENERIC_READ or GENERIC_WRITE, 0, nil, 
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 
  if hFile = INVALID_HANDLE_VALUE then 
    exit; 

  //установка требуемых параметров 
  GetCommState(hFile, DCB); //чтение текущих параметров порта 
  PortParam := 'baud=' + IntToStr(BaudRate) + ' parity=' + Parity + 
    ' data=8 stop=1 ' + 
    'octs=off'; 
  if BuildCommDCB(PChar(PortParam), DCB) then 
  begin 
    result := SetCommState(hFile, DCB) and 
      SetCommTimeouts(hFile, CommTimeOuts); 
  end; 
  if not result then 
    CloseCom; 
end; 

procedure TComPort.CloseCom; 
begin 
  if hFile < > INVALID_HANDLE_VALUE then 
    CloseHandle(hFile); 
  hFile := INVALID_HANDLE_VALUE; 
end; 

function TComPort.ReceiveCom(var Buffer; Size: DWORD): Integer; 
var 
  Received: DWORD; 
begin 
  if hFile = INVALID_HANDLE_VALUE then 
    raise Exception.Create('Не открыта запись в Com порт'); 
  if ReadFile(hFile, Buffer, Size, Received, nil) then 
  begin 
    Result := Received; 
  end 
  else 
    raise Exception.Create('Ошибка приема данных: ' + IntToStr(GetLastError)); 
end; 

function TComPort.SendCom(var Buffer; Size: DWORD): Integer; 
var 
  Sended: DWORD; 
begin 
  if hFile = INVALID_HANDLE_VALUE then 
    raise Exception.Create('Не открыта запись в Com порт'); 
  if WriteFile(hFile, Buffer, Size, Sended, nil) then 
  begin 
    Result := Sended; 
  end 
  else 
    raise Exception.Create('Ошибка передачи данных: ' + IntToStr(GetLastError)); 
end; 

function TComPort.ClearInputCom: Boolean; 
begin 
  if hFile = INVALID_HANDLE_VALUE then 
    raise Exception.Create('Не открыта запись в Com порт'); 
  Result := PurgeComm(hFile, PURGE_RXCLEAR); 
end; 

end. 


Тебе необходимы 2 процедуры InitCom и CloseCom .
И еще организуешь две кнопки
одна включить:
Код

EscapeCommFunction( hFile, SETRTS);

другая выключить, с кодом:
Код

EscapeCommFunction( hFile, CLRRTS);


А далее эксперементируйsmile

ЗЫ код я не проверял , нету у меня девайса на ком порт.

Автор: R0nin 8.10.2005, 02:03
to Romikgy
а как пользлваться функциями включения отключения? smile
а что ты имел ввиду говоря?
Цитата
Тебе необходимы 2 процедуры InitCom и CloseCom .

Автор: cardinal 8.10.2005, 13:40
R0nin, честное слово, пора бы книжку открыть...

Автор: R0nin 9.10.2005, 14:04
smile Что, достал всех уже? Ну ладна, буду книжьки читать! smile
Спасиба за муки с начинающимися! smile

Автор: cardinal 9.10.2005, 15:06
Нет, не достал, но книжку открыть пора! smile

Автор: R0nin 9.10.2005, 22:19
Просто в книжках стандартные компоненты и их описание, калькулятор я и сам могу написать.
А тут захотел подарок зделать лбимой девушке (тоже начинающий программер) в виде коврика с софтом под него, чтоб все как пологен было! Правильно же?! Ну а умений то у меня и не хватило! smile Вот я и мучаю себя и других (Звиняйте уж) smile

Автор: Петрович 14.10.2005, 12:28
Цитата(cardinal @ 6.10.2005, 13:25)
ShadeSt, не знаешь ли ты такого терминала, чтобы


Цитата
Чтоб я мог вызывать ее из комадной строки, типа

terminal.exe -sendmode hex -send 0F 5A FE
или
terminal.exe -sendmode char -send A B C D E

И чтобы она, разумеется, не появлялась формой, а там в командной строке работала и завершалась.

Такого быть не может поскольку при завершении программы винды будут освобождать COM-порт, и могут даже изменять состояние его оправляющих сигналов. Так что, между запусками terminal.exe состояние порта не будет сохраняться.

Автор: cardinal 14.10.2005, 19:30
Цитата
Такого быть не может поскольку при завершении программы винды будут освобождать COM-порт

А это ИМХО пофиг, т.к. сохранятся ничего и не должно. Запустил, отправил, прибор получил и усе...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)