Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> приём данных через COM 2 порт 
:(
    Опции темы
Sholkin
Дата 10.12.2004, 18:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте.
Проблема вот в чём. Нужно написать программу для получения данных через ком порт .
COM 2. Нашёл пример программы . Но не могу разобраться вот в чём .Она работает но ни чего не принимает с ком порта . Порт настроен но переменная
Blocks:=Stat.cbInQue div BufSize; всегда равна нулю. Функция Stat.cbInQue количество данных в буфере не выполняется . Почему ? Или нужна другая функция .
Просьба помочь. Исходник своей программы предоставляю
Код
unit com_2;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Buttons, ComCtrls, ExtCtrls;
type
 TForm1 = class(TForm)
   Label1: TLabel;
   Label2: TLabel;
   STPanel: TStatusBar;
   BitBtn1: TBitBtn;
   BitBtn2: TBitBtn;
   Timer1: TTimer;
   Label3: TLabel;
   procedure BitBtn2Click(Sender: TObject);
   procedure BitBtn1Click(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
var
 Form1: TForm1;
 hCOM,hOUTFile:tHandle;
 DCB:tDCB;
 Stat:tCOMStat;
 ByteCount:dWord;
 Lock:bool;
 DataBuf:array[1..45] of byte;
const
 BufSize=SizeOf(DataBuf);
implementation
{$R *.dfm}
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
close;
end;
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
   Stat.cbInQue:=0;
   ByteCount:=0;
   Lock:=true;
    hCOM:=CreateFile('COM2',GENERIC_READ,0,nil, //открывает коммуникационные ресурсы
    OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  if hCOM=INVALID_HANDLE_VALUE then begin
     ShowMessage('Не могу открытьпорт');
     Application.Terminate;
     end;
    ShowMessage('Oткрыт порт COM2');
    ShowMessage('Идёт настройка порта');
    SetupComm(hCom,1600,1600);           // размер буфферов ввода вывода
    GetCommState(hCOM,DCB);             //читает текущие настройки ресурсов
    with DCB do begin
    BaudRate:=9600;                   // Скорость передачи
    ByteSize:=8;                     // количество бит в байте
    Parity:=EvenParity;                   // бит паритета
    StopBits:=OneStopBit;               // стоп биты
    end;
    SetCommState(hCOM,DCB);             //устанавлиает настройки ресурсов
    if not SetCommState(hCOM,DCB) then begin
    ShowMessage('Порт COM2 не настроен');
    Application.Terminate;
    end;
   hOUTFile:=CreateFile('OUT.BIN',GENERIC_READ or GENERIC_WRITE,0,nil,
   OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
   if hOUTFile=INVALID_HANDLE_VALUE then begin
   ShowMessage('Не могу открыть выходной фаил');
   Application.Terminate;
   end;
   Lock:=false;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var I,Blocks,Errors,Bytes:dWord;
begin
STPanel.Panels[1].Text:='Текущая Дата / ' + DateToStr(Date);
STPanel.Panels[2].Text:='Текущее время / ' + TimeToStr(Time);
if not Lock then begin
     Lock:=true;
     ClearCommError(hCom,Errors,@Stat);   //возвращает информацию о состоянии COM порта
     Blocks:=Stat.cbInQue div BufSize;    //колличество данных в буфере которые ещё не прочитаны
     Label3.Caption:=IntToStr(Blocks);
     Label3.Refresh;
     ShowMessage('Идёт передача');
     if Blocks>0 then begin
       for I:=1 to Blocks do begin
       if not ReadFile(hCOM,DataBuf[i],1,Bytes,nil)  then Beep;
           WriteFile(hOUTFile,DataBuf[i],1,Bytes,nil);
           inc(ByteCount,Bytes);
           end;
       Label2.Caption:=Label2.Caption+' '+IntToStr(DataBuf[i]);
       FlushFileBuffers(hOUTFile);       //скидывает даные из буфера в фаил
       end;
     Label2.Caption:='передан блок'+IntToStr(Blocks);
     Label1.Caption:='Прочитано - '+IntToStr(Blocks)
           +' блоков.  Записано в фаил - '
           +IntToStr(ByteCount)+'  байт';
     CloseHandle(hCom);
     CloseHandle(hOUTFile);
                end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Lock:=true;
end;
end.


Это сообщение отредактировал(а) Girder - 10.12.2004, 21:02
  Вверх
Girder
Дата 11.12.2004, 04:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Надеюсь... что сброс буфера в файл ты сам допишеш. Я пометил где енто сделать... smile

Удачи.

Присоединённый файл ( Кол-во скачиваний: 104 )
Присоединённый файл  COM2_Girder.zip


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Pathfider
Дата 13.1.2005, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 128
Регистрация: 13.7.2004
Где: все там же

Репутация: нет
Всего: 1



А ещ можно найти компонент tmsa32. Там есть то, что тебе нужно.
--------------------
Trust is a weakness
PM MAIL   Вверх
Sholkin
Дата 25.1.2005, 18:26 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Всё это хорошо. Но как заставить работать мою программу ?
Всё же почему не выполняеться команда Stat.cbInQue (смотреть выше мою программу)

Убрал этот кусок с этой функцией
Код

Blocks:=Stat.cbInQue div BufSize;    //колличество данных в буфере которые ещё не прочитаны
Label3.Caption:=IntToStr(Blocks);
Label3.Refresh;
ShowMessage('Идёт передача');
if Blocks>0 then begin
 for I:=1 to Blocks do begin
   if not ReadFile(hCOM,DataBuf[i],1,Bytes,nil)  then Beep;
    WriteFile(hOUTFile,DataBuf[i],1,Bytes,nil);
    inc(ByteCount,Bytes);
    end;


просто написал
Код

ReadFile(hCOM,DataBuf[i],1,Bytes,nil)
WriteFile(hOUTFile,DataBuf[i],1,Bytes,nil);


читает данные но если нет данных в сом порте зависает

Как эту проблему решить и почему не выполняеться команда Stat.cbInQue ?

Это сообщение отредактировал(а) Girder - 25.1.2005, 18:50
  Вверх
Гость_Sholkin
Дата 16.2.2005, 14:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте.
Ещё раз хочу вернуться к этой проблеме . Модифицировал программу.
добавил

Код

ReadFile(hCOM,Blocks,1,Bytes,nil);
Label3.Caption:=IntToStr(Bytes);
if Bytes=0 then  begin
  Lock:= true;
  CloseHandle(hCom);
  CloseHandle(hOUTFile);
  end;



Всё нормально .Но проблема вот в чём . Что она бод 2000 и XP не работает , Виснит на команде
ReadFile(hCOM,Blocks,1,Bytes,nil);

Если перед запуском моей программы запустить программу которую предложил Girder всё нормально работает
Помогите разобраться почему виснит ???


Исводник прелогаю

Код

unit com_2;

interface

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

type
 TForm1 = class(TForm)
   Label1: TLabel;
   Label2: TLabel;
   STPanel: TStatusBar;
   BitBtn1: TBitBtn;
   BitBtn2: TBitBtn;
   Timer1: TTimer;
   Label3: TLabel;
   procedure BitBtn2Click(Sender: TObject);
   procedure BitBtn1Click(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
const
SizeBuf=1600;
var
 Form1: TForm1;
 hCOM,hOUTFile:tHandle;
 DCB:tDCB;
 Stat:tCOMStat;
 ByteCount:dWord;
 Lock:bool;
 DataBuf:array[1..45] of byte;
 Buf:array [0..SizeBuf-1] of Char;
const
 BufSize=SizeOf(DataBuf);

implementation

{$R *.dfm}

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
close;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var  Blocks,bytes:dWord;

begin
   Stat.cbInQue:=0;
   ByteCount:=0;
   Lock:=true;
    hCOM:=CreateFile('COM2',GENERIC_READ,0,nil, //открывает коммуникационные ресурсы
    OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  if hCOM=INVALID_HANDLE_VALUE then begin
     ShowMessage('Не могу открыть порт');
     Application.Terminate;
     end;
    ShowMessage('Oткрыт порт COM2');
    ShowMessage('Идёт настройка порта');
    SetupComm(hCom,1600,1600);           // размер буфферов ввода вывода
    GetCommState(hCOM,DCB);             //читает текущие настройки ресурсов
    with DCB do begin
    BaudRate:=9600;                   // Скорость передачи
    ByteSize:=8;                     // количество бит в байте
    Parity:=EvenParity;                   // бит паритета
    StopBits:=OneStopBit;               // стоп биты
    end;
    SetCommState(hCOM,DCB);             //устанавлиает настройки ресурсов
    if not SetCommState(hCOM,DCB) then begin
    ShowMessage('Порт COM2 не настроен');
    Application.Terminate;
    end;
   hOUTFile:=CreateFile('OUT.BIN',GENERIC_READ or GENERIC_WRITE,0,nil,
   OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
   if hOUTFile=INVALID_HANDLE_VALUE then begin
   ShowMessage('Не могу открыть выходной фаил');
   Application.Terminate;
   end;
Lock:=false;

ReadFile(hCOM,Blocks,1,Bytes,nil);
Label3.Caption:=IntToStr(Bytes);
if Bytes=0 then  begin
  Lock:= true;
  CloseHandle(hCom);
  CloseHandle(hOUTFile);
  end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var I,b,Blocks,Errors,Bytes:dWord;

begin
STPanel.Panels[1].Text:='Текущая Дата / ' + DateToStr(Date);
STPanel.Panels[2].Text:='Текущее время / ' + TimeToStr(Time);

//Blocks:= ReadComm(Buf,SizeBuf);

//ReadFile(hCOM,Blocks,1,Bytes,nil);
//if Blocks<>0 then Lock:= true;


  if not Lock then begin
     Lock:=true;
     ClearCommError(hCom,Errors,@Stat);   //возвращает информацию о состоянии COM порта
     Blocks:=Stat.cbInQue div BufSize;    //колличество данных в буфере которые ещё не прочитаны
     Label3.Caption:=IntToStr(Blocks);
     ShowMessage('Идёт приём даных');
     if Blocks>0 then begin
       for I:=1 to Blocks do begin
       if not ReadFile(hCOM,DataBuf [i],1,Bytes,nil)  then Beep;
           WriteFile(hOUTFile,DataBuf[i],1,Bytes,nil);
           inc(ByteCount,Bytes);
           end;
       Label2.Caption:=Label2.Caption+' '+IntToStr(DataBuf[i]);
       FlushFileBuffers(hOUTFile);       //скидывает даные из буфера в фаил
      end;
     Label2.Caption:='передан блок'+IntToStr(Blocks);
     Label1.Caption:='Прочитано - '+IntToStr(Blocks)
           +' блоков.  Записано в фаил - '
           +IntToStr(ByteCount)+'  байт';
     CloseHandle(hCom);
     CloseHandle(hOUTFile);
    end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Lock:=true;
end;

end.


Это сообщение отредактировал(а) Girder - 16.2.2005, 15:09
  Вверх
Girder
Дата 16.2.2005, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата
Если перед запуском моей программы запустить программу которую предложил Girder всё нормально работает
Помогите разобраться почему виснит ???
Устройство... ты сконфигурировал smile а вот параметры блокировки на чтение и запись не задал. smile

Код
var CTO:TCommTimeOuts;
...
   SetCommState(hCOM,DCB);            
   //if not SetCommState(hCOM,DCB) then begin
   //ShowMessage('Порт COM2 не настроен');
   //Application.Terminate;
   CTO.ReadTotalTimeoutConstant:=50;
 CTO.ReadIntervalTimeout:=50;
 CTO.ReadTotalTimeoutMultiplier:=1;
 CTO.WriteTotalTimeoutMultiplier:=0;
 CTO.WriteTotalTimeoutConstant:=10;
 SetCommTimeouts(hCOM,CTO);
   //end;
  hOUTFile:=CreateFile('OUT.BIN',GENERIC_READ or GENERIC_WRITE,0,nil,
  OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);


PS: И много... чего еще можно(и нужно) изменить(и добавить... типо WaitCommEvent и т.п.) в твоей проге smile

Это сообщение отредактировал(а) Girder - 16.2.2005, 17:24


--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Bes
Дата 21.2.2005, 07:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: нет
Всего: 7



Надо испытанный модуль или решили проблему?
PM MAIL   Вверх
Radix
Дата 21.2.2005, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 18.2.2005

Репутация: нет
Всего: нет



Цитата
Порт настроен но переменная Blocks:=Stat.cbInQue div BufSize; всегда равна нулю.
- а зачем делать div ? Не проще ли просто смотреть, сколько байт принято, у тебя прием ведь всё равно побайтно?
Код

procedure TForm1.Timer1Timer(Sender: TObject);
var I,Blocks,Errors,Bytes,K:dWord;
begin
  ...
  K:=Stat.cbInQue;
//   Blocks:=Stat.cbInQue div BufSize;    колличество данных в буфере которые ещё не прочитаны
  ...
     if K>0 then begin
       for I:=1 to K do begin
       if not ReadFile(hCOM,DataBuf[i],1,Bytes,nil)  then Beep;
           WriteFile(hOUTFile,DataBuf[i],1,Bytes,nil);
           inc(ByteCount,Bytes);
           end;
  ...
end;

PM MAIL   Вверх
Гость_Sholkin
Дата 8.7.2005, 13:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Здравствуйте.

Ёщё раз хочу вернуться к программе передачи по COM 2 порту
Написал два модуля один передает данные другой принимает. По отдельности вроде бы работают но проверить действительно ли данные физически отправляются нет возможности . Соединил эти два одуля в одну программу . Сначала передаю потом принимаю на одном компе .
Вопрос вот какой . Таким способом можно проверить программу или нет ?
Вопрос второй не выполняется блок в программе проверки наличия данных для приема


Код
//ReadFile(hCOM,Blocks,1,Bytes,nil);
//Label3.Caption:=IntToStr(Bytes);
//if Bytes=0 then  begin
//   Lock:= true;
//   CloseHandle(hCom);
//   CloseHandle(hOUTFile);
//   ShowMessage('Нет данных для приёма');
//   end;
с ним программа виснет . По отдельности работают а в совместной нет.

Исходник прилогаю
Код

com_2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ComCtrls, ExtCtrls;
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    STPanel: TStatusBar;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Timer1: TTimer;
    Label3: TLabel;
    procedure BitBtn2Click(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
 SizeBuf=1600;
var
  Form1: TForm1;
  hCOM,hOUTFile:tHandle;
  DCB:tDCB;
  Stat:tCOMStat;
  ByteCount:dWord;
  Lock:bool;
  DataBuf:array[1..45] of byte;
  Buf:array [0..SizeBuf-1] of Char;
const
  BufSize=SizeOf(DataBuf);

implementation

{$R *.dfm}

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
 close;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
var  Blocks,bytes,Errors,I:dWord;
      CTO:TCommTimeOuts;
begin
    Stat.cbInQue:=0;
    ByteCount:=0;
    Lock:=true;
     hCOM:=CreateFile('COM2',GENERIC_WRITE,0,nil, //открывает коммуникационные ресурсы
     OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
   if hCOM=INVALID_HANDLE_VALUE then begin
      ShowMessage('Не могу открыть порт');
      Application.Terminate;
      end;
     ShowMessage('Oткрыт порт COM2');
     ShowMessage('Идёт настройка порта');
     SetupComm(hCom,1600,1600);           // размер буфферов ввода вывода
     GetCommState(hCOM,DCB);             //читает текущие настройки ресурсов
     with DCB do begin
     BaudRate:=9600;                   // Скорость передачи
     ByteSize:=8;                     // количество бит в байте
     Parity:=EvenParity;                   // бит паритета
     StopBits:=OneStopBit;               // стоп биты
     end;
     SetCommState(hCOM,DCB);             //устанавлиает настройки ресурсов
     if not SetCommState(hCOM,DCB) then begin
     ShowMessage('Порт COM2 не настроен');
     Application.Terminate;
     end;

    CTO.ReadTotalTimeoutConstant:=50;
    CTO.ReadIntervalTimeout:=50;
    CTO.ReadTotalTimeoutMultiplier:=1;
    CTO.WriteTotalTimeoutMultiplier:=0;
    CTO.WriteTotalTimeoutConstant:=10;
    SetCommTimeouts(hCOM,CTO);

    hOUTFile:=CreateFile('OUT.BIN',GENERIC_READ or GENERIC_WRITE,0,nil,
    OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
    if hOUTFile=INVALID_HANDLE_VALUE then begin
    ShowMessage('Не могу открыть выходной фаил');
    Application.Terminate;
    end;
Lock:=false;

ReadFile(hOUTFile,Blocks,1,Bytes,nil);
Label3.Caption:=IntToStr(Bytes);
if Bytes=0 then  begin
   Lock:= true;
   CloseHandle(hCom);
   CloseHandle(hOUTFile);
   ShowMessage('Нет данных для передачи');
   end;


 if not Lock then begin
      Lock:=true;
      ClearCommError(hCom,Errors,@Stat);   //возвращает информацию о состоянии COM порта
      Blocks:=Stat.cbInQue div BufSize;    //колличество данных в буфере которые ещё не прочитаны
      Blocks:=8;
      Label3.Caption:=IntToStr(Blocks);
      ShowMessage('Идёт передача даных');
      if Blocks>0 then begin
        for I:=1 to Blocks do begin
        if not ReadFile(hOUTFile,DataBuf [i],1,Bytes,nil)  then Beep ;

            WriteFile(hCOM,DataBuf[i],1,Bytes,nil) ;
            inc(ByteCount,Bytes);
            end;
        Label2.Caption:=Label2.Caption+' '+IntToStr(DataBuf[i]);
        FlushFileBuffers(hCOM);       //скидывает даные из буфера в фаил
       end;
      Label2.Caption:='передан блок - '+IntToStr(Blocks);
      Label1.Caption:='Прочитано - '+IntToStr(Blocks)
            +' блоков.  Записано в фаил - '
            +IntToStr(ByteCount)+'  байт';
      //CloseHandle(hCom);
      //CloseHandle(hOUTFile);
     end;

 hOUTFile:=CreateFile('IN.BIN',GENERIC_READ or GENERIC_WRITE,0,nil,
    OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);
    if hOUTFile=INVALID_HANDLE_VALUE then begin
    ShowMessage('Не могу открыть выходной фаил');
    Application.Terminate;
    end;
Lock:=false;


//ReadFile(hCOM,Blocks,1,Bytes,nil);
//Label3.Caption:=IntToStr(Bytes);
//if Bytes=0 then  begin
//   Lock:= true;
//   CloseHandle(hCom);
//   CloseHandle(hOUTFile);
//   ShowMessage('Нет данных для приёма');
//   end;



     
    if not Lock then begin
      Lock:=true;
      ClearCommError(hCom,Errors,@Stat);   //возвращает информацию о состоянии COM порта
      Blocks:=Stat.cbInQue div BufSize;    //колличество данных в буфере которые ещё не прочитаны

      Blocks:=8;

      Label3.Caption:=IntToStr(Blocks);
      ShowMessage('Идёт приём даных');
      if Blocks>0 then begin
        for I:=1 to Blocks do begin
        if not ReadFile(hCOM,DataBuf [i],1,Bytes,nil)  then Beep ;
            WriteFile(hOUTFile,DataBuf[i],1,Bytes,nil) ;
            inc(ByteCount,Bytes);
            end;
        Label2.Caption:=Label2.Caption+' '+IntToStr(DataBuf[i]);
        FlushFileBuffers(hOUTFile);       //скидывает даные из буфера в фаил
       end;
      Label2.Caption:='передан блок'+IntToStr(Blocks);
      Label1.Caption:='Прочитано - '+IntToStr(Blocks)
            +' блоков.  Записано в фаил - '
            +IntToStr(ByteCount)+'  байт';
      CloseHandle(hCom);
      CloseHandle(hOUTFile);
     end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);
var I,b,Blocks,Errors,Bytes:dWord;

begin
STPanel.Panels[1].Text:='Текущая Дата / ' + DateToStr(Date);
STPanel.Panels[2].Text:='Текущее время / ' + TimeToStr(Time);

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Lock:=true;
end;

end.


Это сообщение отредактировал(а) Girder - 8.7.2005, 14:36
  Вверх
Bes
Дата 8.8.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 806
Регистрация: 8.12.2004

Репутация: нет
Всего: 7



Надо испытанный модуль или решили проблему?
PM MAIL   Вверх
Петрович
Дата 8.8.2005, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 15
Всего: 55



Цитата
Вопрос вот какой . Таким способом можно проверить программу или нет ?

Сделай Nul-модемный кабель и соедини им два порта одного компа. Сможешь в один порт передавать данный, а из другого принимать.


--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Akella
Дата 15.8.2005, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Girder, узнаёшь свой код?
так вот
во время выполнения программы требуется менять имя порта,
нажимаю кнопку инициализации порта - всё нормально, нажимаю, второй раз подряд - получается, что ComHandle := INVALID_HANDLE_VALUE smile
третий раз нажимаю - опять всё в порядке

(никаких параметров не меняю)
Код

function TComPort.OpenInitPort(Size:Cardinal):boolean;
var CTO      : TCommTimeOuts;
    DCB      : TDCB;
    PortName : string;
begin
 Result:=false;
 PortName:=trim('COM'+IntToStr(PortNumber));//COM1
 CloseHandle(ComHandle);
 ComHandle := 0;
// if (ComHandle = 0) or (ComHandle=INVALID_HANDLE_VALUE) then
 Application.ProcessMessages;
 ComHandle:=CreateFile(PChar(PortName),
                       GENERIC_READ{ or GENERIC_WRITE},
                       0{FILE_SHARE_READ or FILE_SHARE_WRITE},
                       nil,
                       OPEN_EXISTING,
                       FILE_ATTRIBUTE_NORMAL,
                       0);
 if (ComHandle=INVALID_HANDLE_VALUE) or (ComHandle = 0) then
 begin
  MessageBox(0, PAnsiChar('Не удается открыть '+PortName), 'Ошибка!', MB_ICONWARNING or MB_OK);
  exit;
 end;//if
 DCB.DCBlength:=SizeOf(TDCB);
 if (DWord(SetupComm(ComHandle,SizeBuf,SizeBuf))=0)or(DWord(GetCommState(ComHandle,DCB))=0) then
  begin
   CloseHandle(ComHandle);
   ComHandle:=INVALID_HANDLE_VALUE;
   exit;
  end;
  DCB.BaudRate:=Baud;
  DCB.StopBits:=OneStopBit;
  DCB.Parity:=EvenParity;
  DCB.ByteSize:=8;
  if (DWord(SetCommState(ComHandle,DCB))=0)or(DWord(GetCommTimeouts(ComHandle,CTO))=0) then
   begin
    CloseHandle(ComHandle);
    ComHandle:=INVALID_HANDLE_VALUE;
    exit;
   end;
  CTO.ReadTotalTimeoutConstant:=50;
  CTO.ReadIntervalTimeout:=50;
  CTO.ReadTotalTimeoutMultiplier:=1;
  CTO.WriteTotalTimeoutMultiplier:=0;
  CTO.WriteTotalTimeoutConstant:=10;
  if (DWord(SetCommTimeouts(ComHandle,CTO))=0)or(DWord(SetCommMask(ComHandle,EV_RING+EV_RXCHAR+EV_RXFLAG+EV_TXEMPTY))=0) then
   begin
    CloseHandle(ComHandle);
    ComHandle:=INVALID_HANDLE_VALUE;
   end else Result := true;
  Sleep(1000);
end;



PM MAIL   Вверх
Akella
Дата 15.8.2005, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



кстати, зачем сюда
Код

  function TComPort.OpenInitPort(Size:Cardinal):boolean;

передавать size???
Добавлено @ 17:05
проблему вроде решил, но посмотрим, что будет дальше

Код

begin
 Result:=false;
 PortName:=trim('COM'+IntToStr(PortNumber));//COM1
 CloseHandle(ComHandle);
 ComHandle := 0;
---> Sleep(1000);<--- это строкой
// if (ComHandle = 0) or (ComHandle=INVALID_HANDLE_VALUE) then
 Application.ProcessMessages;
 ComHandle:=CreateFile(PChar(PortName),
                       GENERIC_READ{ or GENERIC_WRITE},
                       0{FILE_SHARE_READ or FILE_SHARE_WRITE},
                       nil,
                       OPEN_EXISTING,
                       FILE_ATTRIBUTE_NORMAL,
                       0);
 if (ComHandle=INVALID_HANDLE_VALUE) or (ComHandle = 0) then
 begin
...

PM MAIL   Вверх
Girder
Дата 15.8.2005, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 25
Всего: 155



Цитата(dsergey @ 15.8.2005, 17:43)
нажимаю кнопку инициализации порта - всё нормально, нажимаю, второй раз подряд - получается, что ComHandle := INVALID_HANDLE_VALUE
А что возвращает GetLastError?

Цитата(dsergey @ 15.8.2005, 18:01)
кстати, зачем сюда
А там строчка... с ошибкой smile . Вместо
Код
if (DWord(SetupComm(ComHandle,SizeBuf,SizeBuf))=0)...
должно быть
Код
if (DWord(SetupComm(ComHandle,Size,Size))=0)




--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Akella
Дата 16.8.2005, 09:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: нет
Всего: 329



Цитата(Girder @ 15.8.2005, 18:31)
А что возвращает GetLastError?

"Отказано в доступе"
Добавлено @ 09:15
Цитата(Girder @ 15.8.2005, 18:31)
А там строчка... с ошибкой  . Вместо
код Pascal/Delphi
1:

if (DWord(SetupComm(ComHandle,SizeBuf,SizeBuf))=0)...




должно быть
код Pascal/Delphi
1:

if (DWord(SetupComm(ComHandle,Size,Size))=0)

ну ты, блин, даёшь smile
тем немнее всё работало, исправил, проверю smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0649 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.