Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не могу связать 2 компа через COM-порт. Помогите! [D7, WinXP]


UnDISCOvery ©   (2004-10-20 18:13:00) 

Пытаюсь наладить обмен данными между 2 компами через последовательный порт. Использую CreateFile. На локальной машине все ОК - СОМ1 и СОМ2 замечательно принимают и получают 8битовые данные. А вот когда переткнешь кабель в удаленную машину - то нифига не работает. Настройки портов согласованы, кабель в порядке.  Так в чем же дело???


GanibalLector   (2004-10-22 13:06:00) [1]

> Дело было в настройках тайм-аутов и в синхронизации
А я тебе про это и говорил...
>Что за зверь такой PortMon? И что он мне может дать?
Поисковик+PortMon= http://www.sysinternals.com


UnDISCOvery   (2004-10-22 12:16:00) [2]

Проблема снята. Дело было в настройках тайм-аутов и в синхронизации


UnDISCOvery   (2004-10-21 18:06:00) [3]

Приведеннный код не работает. Даже на одной машине.
"Error read port"


neat   (2004-10-21 13:24:00) [4]

Рабочий текст. Ставить на обе машины. Чуть-чуть глючит сначала, когда первый раз пытаешься принять строку(она в программе ('1234567')). Прошу прощения, не успел отладить полностью.

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   btSend: TButton;
   ed1: TEdit;
   btQuit: TButton;
   btRead: TButton;
   Timer1: TTimer;
   Label1: TLabel;
   btInit: TButton;
   procedure btSendClick(Sender: TObject);
   procedure btQuitClick(Sender: TObject);
   procedure btReadClick(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure btInitClick(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1     : TForm1;
 ovr       : TOverlapped;
 f         : THandle;
 io        : byte;
 PortInit  : boolean;
 buf       : array[0..127] of char;
 lpEvtMask : DWORD;

implementation

{$R *.dfm}

//**********************************************************************

//инициализация порта
procedure TForm1.btInitClick(Sender: TObject);
var ct: TCommTimeouts;
   dcb: TDCB;
begin
 PortInit := False;
 f := Windows.CreateFile(PChar('COM1'),
                         GENERIC_READ or GENERIC_WRITE,
                         FILE_SHARE_READ or FILE_SHARE_WRITE,
                         nil,
                         OPEN_EXISTING,
                         FILE_FLAG_OVERLAPPED,
                         0);
 if (f < 0) or not SetupComm(f, 2048, 2048)or not GetCommState(f, dcb)
 then exitprocess(0); //init error

 dcb.BaudRate := 9600;
 dcb.StopBits := 0;
 dcb.Parity := 0;
 dcb.ByteSize := 8;

 if not SetCommState(f, dcb) or not GetCommTimeouts(f, ct)
 then exitprocess(0);                //error

//   --- таймауты---
 ct.ReadTotalTimeoutConstant := 0;
 ct.ReadIntervalTimeout := MAXDWORD;
 ct.ReadTotalTimeoutMultiplier := 0;//1;
 ct.WriteTotalTimeoutMultiplier := 0;
 ct.WriteTotalTimeoutConstant := 0;//10;

 if not SetCommTimeouts(f, ct) or not SetCommMask(f, lpEvtMask)
 then exitprocess(0);               //error

 PortInit := True;
 btSend.Enabled := True;
 btRead.Enabled := True;
end;

//*******************  запись в порт  ************************
procedure TForm1.btSendClick(Sender: TObject);
var sw : array [0..6] of char;
   i : integer;
begin
    sw:='1234567';
    io:=1; // запись
    If PortInit then
    begin
       PurgeComm(f, PURGE_TXCLEAR);
       WriteFile(f, sw, Length(sw), DWORD(i), @ovr);
       If GetLastError <> ERROR_IO_PENDING then
           ShowMessage('Error write to port')
       else
           Timer1.Enabled := true;
    end else
       ShowMessage('Error Open Port');
end;
//*********************************************************************
//----чтение порта ------------
procedure TForm1.btReadClick(Sender: TObject);
var    i : integer;
begin
   buf:='';
   io:=2;                 // чтение
   WaitCommEvent(f, lpEvtMAsk, @ovr);
   ReadFile(f, buf, SizeOf(buf), DWORD(i), @ovr);
   If GetLastError <> ERROR_IO_PENDING then
       ShowMessage('Error read port')
   else
   begin
       Form1.ed1.Text:=buf;
       Form1.Timer1.Enabled := true;
       PurgeComm(f, PURGE_RXCLEAR);
   end;
end;

procedure TForm1.btQuitClick(Sender: TObject);
begin
   CloseHandle(f);
   Close;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var n : integer;
   s : string;
begin
   If GetOverLappedResult(f, ovr, DWORD(n), false) then
   begin
       case io of
       1:  s:='Переданы';
       2:  s:='Получены';
       end;
       Label1.Caption := s+' данные - '+ IntToStr(n) + ' байт';
       Timer1.Enabled := false;
   end else
       Label1.Caption := 'Новых данных нет';
end;

end.


UnDISCOvery   (2004-10-21 12:43:00) [5]

Что за инициализация портов?
Можно кусок кода?


UnDISCOvery   (2004-10-21 12:41:00) [6]

Что за зверь такой PortMon? И что он мне может дать?
Какое влияние оказывает таймаут и где его менять, если что?

Порт рабочий, хэндл в норме. Все настройки согласованы (открываются порты по одной строке соединения).


UnDISCOvery   (2004-10-21 12:28:00) [7]

Что за зверь такой PortMon? И что он мне может дать?
Какое влияние оказывает таймаут и где его менять, если что?

Порт рабочий, хэндл в норме. Все настройки согласованы (открываются порты по одной строке соединения).


Дмитрий Ботвин   (2004-10-21 11:52:00) [8]

А ты инициализацию портов проводишь перед передачей данных.
Я с такой проблемой сталкивался. Решил её путем инициализации
портов командой mode перед их использованием. Я заметил сама
Windows их не инициализирует и те параметры, которая она показывает в свойствах портов, на самом деле не установлены...


UnDISCOvery   (2004-10-21 11:46:00) [9]

Что за зверь такой PortMon? И что он мне может дать?
Какое влияние оказывает таймаут и где его менять, если что?

Порт рабочий, хэндл в норме. Все настройки согласованы (открываются порты по одной строке соединения).


negrila   (2004-10-21 07:04:00) [10]

битрейт и прочее согласовано? А то бывают молодцы иногда.


GanibalLector   (2004-10-20 19:14:00) [11]

PortMon-попробуй,посмотри.Что происходит при приеме,как открывается порт,какие таймауты и прочее.
Может у тя порт не рабочий( INVALID_HANDLE_VALUE) ???


UnDISCOvery   (2004-10-20 18:57:00) [12]

Уточняю: использую одну и ту же прогу, которая может подсоединиться  к 2 сом-портам, читать из них и писать в них.
На одной машине все работает, а с двумя посылать то посылает, все без ошибок, а вот другой то что послано не получает.


Наверх

Титульная страница Поиск, карта сайта Написать письмо