Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
3-1099281236
Explorer
2004-11-01 06:53
2004.12.05
Работа с серверной БД


4-1098088573
DelphiLexx
2004-10-18 12:36
2004.12.05
RegisterServiceProcess


1-1100802846
Sniper-Max
2004-11-18 21:34
2004.12.05
Edit и удобный ввод времени... Как это сделать?


9-1091792808
johndoe
2004-08-06 15:46
2004.12.05
DTMF на входе звуковухи


14-1100487683
Думкин
2004-11-15 06:01
2004.12.05
С днем рождения! 15 ноября





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский