Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.09.17;
Скачать: CL | DM;

Вниз

Помогите разобраться с COM портом   Найти похожие ветки 

 
vodvorezlaya   (2006-05-18 09:26) [0]

Здравствуйте. Задача стоит такая.

Есть COM порт к нему подключено 3 сигнала Тх,Rx и GND.

И используется неизвестный протокол.

Необходимо отправлять на порт данные и принимать их в асинхронном режиме. (к примеру $02 или $FF).

Как это сделать. Статей прочитал много и не один из примеров не заработал.(createfile и т.д.).

Т.е. нужно просто аппаратно отправлять байты.
(Я ставлю 3 комп чтобы он прооколировал все данные и был по середине между 1 и 2. Принял байт с СОМ1 и сразу передал СОМ2 и наоборот)

Заранее спасибо.


 
Сергей М. ©   (2006-05-18 09:39) [1]


> не один из примеров не заработал


Отладчиком не пробовал воспользоваться ?


 
tesseract ©   (2006-05-18 09:40) [2]


>  не один из примеров не заработал

на то он и пример, чтобы не работать :-)


 
vodvorezlaya   (2006-05-18 09:58) [3]


> Отладчиком не пробовал воспользоваться ?

Пробовал. Порт открываеться а данные не принимает и не отсылает.


 
MBo ©   (2006-05-18 10:03) [4]

Ну показывай код


 
vodvorezlaya   (2006-05-18 10:29) [5]

Ща, здесь два модуля.

Мне надо не по протоколу RS232 байты отправлять...

А по СР525 если знакомо? :)

------------------------------------------------------------------------------

unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 StdCtrls, ExtCtrls, PortUnit;

type
 TForm1 = class(TForm)
   GroupBox1: TGroupBox;
   Button2: TButton;
   Edit1: TEdit;
   Panel2: TPanel;
   Button1: TButton;
   Button3: TButton;
   GroupBox2: TGroupBox;
   Panel1: TPanel;
   Label1: TLabel;
   procedure Button1Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);

begin
PortInit;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
KillComm;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
X:byte;
begin
 X:=StrToInt(Edit1.Text);
 WriteComm(X);
end;

end.

------------------------------------------------------------------------------

unit PortUnit;

interface
uses windows,sysutils;

var
   CommHandle : integer;
   DCB : TDCB;
   Ovr : TOverlapped;
   Stat : TComStat;
   CommThread : THandle;
   hEvent : THandle;
   Flag,StopResive : boolean;
   KolByte,Kols,Mask,TransMask,Errs : DWord;
procedure PortInit;
procedure ReadComm;
procedure WriteComm(A:byte);
procedure KillComm;

implementation

uses
 Main;
 
procedure KillComm;
begin
 TerminateThread(CommThread,0);
 CloseHandle(CommHandle);
end;

procedure WriteComm(A:byte);
var
 Transmit:array [0..255] of char;
begin
 //послать один символ в порт
  KolByte:=1;
  Transmit[0]:=chr(A);
  WriteFile(CommHandle,Transmit,KolByte,KolByte,@Ovr);
end;

procedure ReadComm;
 var
  Resive:array [0..255] of char;
 begin

    while true do
  begin
   TransMask:=0;
   WaitCommEvent(CommHandle,TransMask,@Ovr); //ждем
   if (TransMask and EV_RXFLAG)=EV_RXFLAG then //проверяем нужное событие
    begin
     ClearCommError(CommHandle,Errs,@Stat);//сбрасываем флаг
     Kols := Stat.cbInQue;
     ReadFile(CommHandle,Resive,Kols,Kols,@Ovr);//читаем
     //тут должна идти обработка принятой информации из Resive
     Form1.Panel1.Caption:=string(Resive);
     //не очень хороший вариант вывода, но для примера подойдет
    end;//mask
   end;//while
 end;

procedure PortInit;
 var
  ThreadID:dword;
 begin
 //создание и иницализация порта
 KolByte:=0;

 //создание порта и получение его хэндла
 CommHandle := CreateFile("COM1",GENERIC_READ or GENERIC_WRITE,0,nil,OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED,0);

 //ставим маску - "по пришествии определенного символа"
 SetCommMask(CommHandle,EV_RXFLAG);

 //построение DCB
  GetCommState(CommHandle,DCB);
  DCB.BaudRate:=CBR_9600;
  DCB.Parity:=NOPARITY;
  DCB.ByteSize:=8;
  DCB.StopBits:=OneStopBit;
  DCB.EvtChar:=chr(13);//задание символа для флага
  //устанавливаем DCB
  SetCommState(CommHandle,DCB);
  //создаем паралельный поток
  //там будет вертеться процедура приема строки
  //с порта - ReadComm
  CommThread := CreateThread(nil,0,@ReadComm,nil,0,ThreadID);
 end;
end.
------------------------------------------------------------------------------


 
Сергей М. ©   (2006-05-18 10:45) [6]

Ну и где у тебя инициализация структуры Ovr ?


 
tesseract ©   (2006-05-18 10:48) [7]

а где интересно GetOverlappedResult?
не вижу инициализации OVR для порта, ovr для маски лучше задавать отдельно.

пример для read:

succ:=ReadFile(hCom,value,1,result,@ReadOL);
      if not succ then
            begin
             if GetLastError=ERROR_IO_PENDING then
              if WaitForSingleObject(ReadOl.hEvent,waitint)=WAIT_OBJECT_0 then
               GetOverlappedResult(hCom, ReadOL, result,true);
              end; // if not succ
  end // if fComWait

Маска

tMask:=0;
WaitCommEvent(hCom,tMask,@MaskOL);
fSignaled:= WaitForSingleObject(MaskOl.hEvent,WaitInt);
if fSignaled = WAIT_TIMEOUT then begin cancelIo(hcom); exit; end;
if (fSignaled = WAIT_OBJECT_0) then
   begin
    // смотрим что у нас
         // Читаем
     //   if GetOverlappedResult(hCom, MaskOL,tmp ,true) then
    //     begin
         // Сравниваем произошедшее событие с прибытием символа
           if (tMask xor EV_RXCHAR)=0 then
            begin


 
vodvorezlaya   (2006-05-18 10:53) [8]


> пример для read:

А полностью пример рабочий скинуть можешь?


 
tesseract ©   (2006-05-18 11:18) [9]


> А полностью пример рабочий скинуть можешь?


Долго разбираться будешь он без комментов и явно не полностью доработан:-)

Это пример рабочий. реально рабочий. Чем тебе не нравиться?


 
vodvorezlaya   (2006-05-18 11:26) [10]

Непонятного много, что за OVR структура что за маска.

Мне нужно принимать сигналы только по Rx отправлять по Tx без остальных.

Что такое маска? Я так понял она применяется для того чтоб система знала когда нужно принимать байты по какому сигналу.


 
Сергей М. ©   (2006-05-18 11:42) [11]


> что за OVR структура


Справку читать не пытался ? Там ведь достаточно подробно расписано, что такое OVERLAPPED-структура, когда и с чем ее едят ..


> Что такое маска?


Маской задаются интересующие события в коммуникационном канале при работе с ним в асинхронном режиме... OVERLAPPED-режим как раз и служит для асинхронной работы с устройством.


 
tesseract ©   (2006-05-18 11:50) [12]


> Мне нужно принимать сигналы только по Rx отправлять по Tx
> без остальных.


А по другому и не получится :-))))


 
vodvorezlaya   (2006-05-18 13:01) [13]


> А по другому и не получится :-))))

Не получится.

> Справку читать не пытался ? Там ведь достаточно подробно
> расписано, что такое OVERLAPPED-структура, когда и с чем
> ее едят ..

Das English, NO goog


 
Сергей М. ©   (2006-05-18 13:37) [14]


> Das English, NO goog


Про поисковые системы Интернета слыхал что-нибудь ?

10 секунд я затратил чтобы найти море орусскоязычной док-ции и примеров на ту самую тему !

http://www.google.ru/search?q=CreateFile+%D0%B4%D0%BB%D1%8F+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B+%D1%81+COM-%D0%BF%D0%BE%D1%80%D1%82%D0%BE%D0%BC+OVERLAPPED&start=0&ie=utf-8&oe=utf-8&client=firefox-a&rls=org.mozilla:ru:official
http://www.ru-coding.com/pas_18.php


 
MBo ©   (2006-05-18 13:47) [15]

Если асинхронная работа вызывает большие трудности, можно сначала потренироваться в синхронном режиме, без overlapped. Лучше, конечно, это делать в отдельном потоке, но для проверки работоспособности на первых порах это необязательно. Кроме того, есть готовые библиотеки, например, CPort (Dejan Crnila)


 
vodvorezlaya   (2006-05-18 13:52) [16]


> Если асинхронная работа вызывает большие трудности, можно
> сначала потренироваться в синхронном режиме, без overlapped

С помощью специальной проги работает (RS232pro). Физически там три контакта  и синхронный режим ну никак.


 
Сергей М. ©   (2006-05-18 14:00) [17]


> Физически там три контакта  и синхронный режим ну никак.


В огороде бузина, а в Киеве дядька ...


 
MBo ©   (2006-05-18 14:15) [18]

>Физически там три контакта  и синхронный режим ну никак.
Ты, наверно, что-то путаешь.
Трех проводов достаточно для обеспечения простого обмена по компорту.
Под синхронностью понимается работа метод Windows-функций -
в синхронном режиме ReadFile, например, ждет, пока не придут данные, приостанавливая поток, а в асинхронном поток продолжает работать, а при получении данных сработает указанное в overlapped событие



Страницы: 1 вся ветка

Текущий архив: 2006.09.17;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.084 c
1-1154095062
Still Swamp
2006-07-28 17:57
2006.09.17
Как бы запретить изменение TComboBox.Text?


2-1157071553
Noxi
2006-09-01 04:45
2006.09.17
LPT порты в Делфи


15-1156857160
kobik.
2006-08-29 17:12
2006.09.17
мелкий вопросец


2-1157091092
yel
2006-09-01 10:11
2006.09.17
Передать массив в подпрограмму


8-1141222110
Sco
2006-03-01 17:08
2006.09.17
gluPickMatrix