powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите с СОМ-портом (С++ Builder 6)
6 сообщений из 6, страница 1 из 1
Помогите с СОМ-портом (С++ Builder 6)
    #33313516
Krolikoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я слышал что где-то валяеться класс для работы с СОМ-портом (асинхронный режим). Может у кого-то есть ? Или ссылку кто знает ? Буду очень благодарен.
...
Рейтинг: 0 / 0
Помогите с СОМ-портом (С++ Builder 6)
    #33313665
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин , я даже писал , ну просто ничего сложного нету делов то, 10 минут почитать документацию...

 ш
(';')
(V),(V),,
Код: plaintext
 JS 
...
Рейтинг: 0 / 0
Помогите с СОМ-портом (С++ Builder 6)
    #33313708
Krolikoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JibSkeartблин , я даже писал , ну просто ничего сложного нету делов то, 10 минут почитать документацию...

 ш
(';')
(V),(V),,
Код: plaintext
 JS 

А можно ссылку ? А то на Делфи у меня есть обьект.
Вот он:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
unit ComPort;


interface

uses
  SysUtils, Windows, Variants, Classes;

type
  EComPortError = class(Exception);

  TBaudRate = (br110 = CBR_110,
               br300 = CBR_300,
               br600 = CBR_600,
               br1200 = CBR_1200,
               br2400 = CBR_2400,
               br4800 = CBR_4800,
               br9600 = CBR_9600,
               br14400 = CBR_14400,
               br19200 = CBR_19200,
               br38400 = CBR_38400,
               br56000 = CBR_56000,
               br57600 = CBR_57600,
               br115200 = CBR_115200,
               br128000 = CBR_128000,
               br256000 = CBR_256000);

  TComPort = class;

  {Reading thread}
  TReadThread = class(TThread)
  private
    FBuf: array[ 0 ..$FF] of Byte;
    FComPort: TComPort;
    FOverRead: TOverlapped;
    FRead: DWORD;
    procedure DoRead;
  protected
    procedure Execute; override;
  public
    constructor Create(ComPort: TComPort);
    destructor Destroy; override;
  end;

  {Reading event}
  TReadEvent = procedure(Sender: TObject; ReadBytes: array of Byte) of object;

  {Com port class}
  TComPort = class
  private
    FOverWrite: TOverlapped;
    FPort: THandle;
    FPortName: String;
    FReadEvent: TReadEvent;
    FReadThread: TReadThread;
  public
    constructor Create(PortNumber: Cardinal; BaudRate: TBaudRate);
    destructor Destroy; override;
    procedure Write(WriteBytes: array of Byte);
  published
    property OnRead: TReadEvent read FReadEvent write FReadEvent;
    property PortName: String read FPortName;
  end;

implementation

constructor TReadThread.Create(ComPort: TComPort);
begin
  FComPort := ComPort;
  ZeroMemory(@FOverRead, SizeOf(FOverRead));

  {Event}
  FOverRead.hEvent := CreateEvent(nil, True, False, nil);

  if FOverRead.hEvent = Null then
    raise EComPortError.Create('Error creating read event');

  inherited Create(False);
end;

destructor TReadThread.Destroy;
begin
  CloseHandle(FOverRead.hEvent);

  inherited Destroy;
end;

procedure TReadThread.Execute;
var
  ComStat: TComStat;
  dwMask, dwError: DWORD;
begin
  FreeOnTerminate := True;

  while not Terminated do
  begin
    if not WaitCommEvent(FComPort.FPort, dwMask, @FOverRead) then
    begin
      if GetLastError = ERROR_IO_PENDING then
        WaitForSingleObject(FOverRead.hEvent, INFINITE)
      else
        raise EComPortError.Create('Error waiting port ' + FComPort.PortName
          + ' event');
    end;

    if not ClearCommError(FComPort.FPort, dwError, @ComStat) then
      raise EComPortError.Create('Error clearing port ' + FComPort.PortName);

    FRead := ComStat.cbInQue;

    if FRead >  0  then
    begin
      if not ReadFile(FComPort.FPort, FBuf, FRead, FRead, @FOverRead) then
        raise EComPortError.Create('Error reading port ' + FComPort.PortName);

      Synchronize(DoRead);
    end;
  end; {while}
end;

procedure TReadThread.DoRead;
var
  arrBytes: array of Byte;
  i: Integer;
begin
  if Assigned(FComPort.FReadEvent) then
  begin
    SetLength(arrBytes, FRead);
    for i := Low(FBuf) to FRead -  1  do
      arrBytes[i] := FBuf[i];

    FComPort.FReadEvent(Self, arrBytes);

    arrBytes := nil;
  end;  
end;

constructor TComPort.Create(PortNumber: Cardinal; BaudRate: TBaudRate);
var
  Dcb: TDcb;
begin
  inherited Create;

  ZeroMemory(@FOverWrite, SizeOf(FOverWrite));
  FPortName := 'COM' + IntToStr(PortNumber);

  {Open port}
  FPort := CreateFile(PChar(PortName),
    GENERIC_READ or GENERIC_WRITE,  0 , nil,
    OPEN_EXISTING, FILE_FLAG_OVERLAPPED,  0 );

  if FPort = INVALID_HANDLE_VALUE then
    raise EComPortError.Create('Error opening port ' + PortName);


  try
    {Set port state}
    if not GetCommState(FPort, Dcb) then
      raise EComPortError.Create('Error setting port ' + PortName + ' state');

    Dcb.BaudRate := DWORD(BaudRate);
    Dcb.Parity := NOPARITY;
    Dcb.ByteSize :=  8 ;
    Dcb.StopBits := ONESTOPBIT;

    if not SetCommState(FPort, Dcb) then
      raise EComPortError.Create('Error setting port ' + PortName + ' state');

    {Purge port}
    if not PurgeComm(FPort, PURGE_TXCLEAR or PURGE_RXCLEAR) then
      raise EComPortError.Create('Error purging port ' + PortName);

    {Set mask}
    if not SetCommMask(FPort, EV_RXCHAR) then
      raise EComPortError.Create('Error setting port ' + PortName + ' mask');

    FOverWrite.hEvent := CreateEvent(nil, True, False, nil);

    if FOverWrite.hEvent = Null then
      raise EComPortError.Create('Error creating write event');

    {Reading thread}
    FReadThread := TReadThread.Create(Self);
  except
    CloseHandle(FOverWrite.hEvent);
    CloseHandle(FPort);
    raise;
  end;
end;

destructor TComPort.Destroy;
begin
  if Assigned(FReadThread) then
    FReadThread.Terminate;
    
  CloseHandle(FOverWrite.hEvent);
  CloseHandle(FPort);

  inherited Destroy;
end;

procedure TComPort.Write(WriteBytes: array of Byte);
var
  dwWrite: DWORD;
begin
  if  (not WriteFile(FPort, WriteBytes, SizeOf(WriteBytes), dwWrite, @FOverWrite))
  and (GetLastError <> ERROR_IO_PENDING) then
    raise EComPortError.Create('Error writing port ' + PortName);
end;

end.


Но перевести его на ВС++ не могу - например одна из проблем - передопределение класса ... н у даже вот это
Код: plaintext
TReadEvent = procedure(Sender: TObject; ReadBytes: array of Byte) of object;
не знаю как перевести.
Так что буду благодарен за ссылку. Ну или если кто-то ответит с предопределением класса и этой процедурой как поступить
...
Рейтинг: 0 / 0
Помогите с СОМ-портом (С++ Builder 6)
    #33313770
Фотография JibSkeart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потаму что это будет:

Код: plaintext
1.
TReadEvent = procedure(Sender: TObject; ReadBytes: array of Byte) of object;

как

Код: plaintext
1.
typedef void __fastcall (__closure * TReadEvent)(TObject * Sender , char * ReadBytes);
...
Рейтинг: 0 / 0
Помогите с СОМ-портом (С++ Builder 6)
    #33314295
Krolikoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JibSkeartпотаму что это будет:

Код: plaintext
1.
TReadEvent = procedure(Sender: TObject; ReadBytes: array of Byte) of object;

как

Код: plaintext
1.
typedef void __fastcall (__closure * TReadEvent)(TObject * Sender , char * ReadBytes);

А как быть с предопреледением ?
Я заранее обьявляю на Делфи класс а потом повторно обьякляю. На С++ пишет что ошибка.
...
Рейтинг: 0 / 0
Помогите с СОМ-портом (С++ Builder 6)
    #33314355
Krolikoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И если у кого-то есть готовый обьект то поделитесь. Горю. Надо курсач сдавать а сам с Делфи не успеваю сконвертировать. Дайте ссылку
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите с СОМ-портом (С++ Builder 6)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]