Форум: "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