Форум: "WinAPI";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
ВнизНе могу связать 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.12.05;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c