Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Вниз

Помогите разобраться с 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.038 c
15-1156260813
vase21
2006-08-22 19:33
2006.09.17
поверх всего


15-1156754004
IGray
2006-08-28 12:33
2006.09.17
PDF-оглавление не получается! (Ни в PDFCreator-е, ни в CutePDF)


1-1155006078
vladimirg88
2006-08-08 07:01
2006.09.17
Координаты картинки


2-1157024180
Ref
2006-08-31 15:36
2006.09.17
DBGrid & CheckBox


2-1156749497
GeneralMotors
2006-08-28 11:18
2006.09.17
Пробудить комп





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский