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

Вниз

Не могу связать 2 компа через COM-порт. Помогите!   Найти похожие ветки 

 
UnDISCOvery   (2004-10-20 18:13) [0]

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


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

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


 
GanibalLector ©   (2004-10-20 19:14) [2]

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


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

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


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

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

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


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

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


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

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

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


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

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

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


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

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


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

Рабочий текст. Ставить на обе машины. Чуть-чуть глючит сначала, когда первый раз пытаешься принять строку(она в программе ("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 18:06) [10]

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


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

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


 
GanibalLector ©   (2004-10-22 13:06) [12]

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



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

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

Наверх




Память: 0.5 MB
Время: 0.051 c
8-1094300342
вразлет
2004-09-04 16:19
2004.12.05
Звук


1-1101304126
Mishenka
2004-11-24 16:48
2004.12.05
Переопределение свойства у компанента


1-1101205890
MikePol
2004-11-23 13:31
2004.12.05
ссылки в Delphi


4-1098200620
crio
2004-10-19 19:43
2004.12.05
Работа со сканером


6-1096396967
Наташа
2004-09-28 22:42
2004.12.05
Какой самый быстрый способ скачивания файлов?