powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с переводом 00 в символ для отправки в COM порт
19 сообщений из 19, страница 1 из 1
Проблема с переводом 00 в символ для отправки в COM порт
    #40015445
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Столкнулся тут с одной задачкой и не могу ее решить.
Для работы с СОМ портом использую компонент ComPort из библиотеки ComPort Library. Для проверки работы программу - AccessPort.
В порт надо отправить команду AA 02 FF 00 00 A4 0F. ComPort для отправки принимает только значения string переменной. Перевожу команду в строку нарытым кодом:
Код: pascal
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.
function TForm1.HexToStr(HexStr : String; const Text : boolean = True): string;
var
  Hex : byte;
  sTemp : string;
  i : integer;
begin
  Result := '';
  HexStr:= StringReplace(HexStr, ' ', '', [rfReplaceAll]);
  if Length(HexStr) mod 2 <> 0 then
    Exit;

  for i := 2 to Length(HexStr) do
    if i mod 2 = 0 then begin
      sTemp := '$' + Copy(HexStr, i - 1, 2);
      Hex := Byte(StrToInt(sTemp));

      if Hex = $00 then begin
        if Text then
          Result := Result + ' '
        else
          Result := Result + #$00;
        Continue;
      end;

      Result := Result + chr(Hex);
    end;
end;


В результате получается строка https://prnt.sc/vdt0sm https://prnt.sc/vdt0sm
При выполнении команды
Код: pascal
1.
ComPort.WriteStr(Str);

в AccessPort мы видим https://prnt.sc/vdt529 , что вместо 00 отправляется 20 (пробел, который образовался при конвертировании).

Подскажите как это можно исправить.
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015463
x1ca4064
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hadroran,

Вызывайте HexToStr('AA 02 FF 00 00 A4 0F',false), а еще лучше напишите свой конвертер.
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015467
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Hadroran,

а я в библиотеке вижу вот такой метод:
Код: pascal
1.
function Write(const Buffer; Count: Integer): Integer;



которым без проблем можно отправить буфер:

Код: pascal
1.
2.
3.
4.
5.
6.
var
  Buf : TBytes ;
begin
  Buf := [$AA, $02, $FF, $00, $00, $A4, $0F] ;
  ComPort.Write(Buf[0], Length(Buf)) ;
end;
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015472
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hadroran,

Вы делаете строку с двумя пробелами и удивляетесь что у вас отправляется строка с двумя пробелами?..
Код: pascal
1.
2.
3.
4.
5.
function TForm1.HexToStr(HexStr : String; const Text : boolean = True): string;
...
      if Hex = $00 then begin
        if Text then
          Result := Result + ' '
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015478
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,

Ранее я использовал этот метод, но опять со строкой
Код: pascal
1.
ComPort.Write(Str[1], Length(Str));


Спасибо за помощь. Тема закрыта.
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015481
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Hadroran
defecator,

Ранее я использовал этот метод, но опять со строкой
Код: pascal
1.
ComPort.Write(Str[1], Length(Str));



Спасибо за помощь. Тема закрыта.


зачем тебе строка, если можно двоичный буфер отправлять сразу
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015508
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,

Нет, простите, закрылись, а вопросы остались.
А получить данные теперь то как? Если со строкой все понятно было, то теперь, я так понял, надо изменить свойство
Код: pascal
1.
TriggersOnRxChar := false;


и соответственно читать событие
Код: plaintext
 OnRxBuf(Sender: TObject; const Buffer; Count: Integer); 

Но как? Есть метод
Код: plaintext
 function Read(var Buffer; Count: Integer): Integer; 
но не соображу, как его использовать, т.к. еще и справка запутала.
авторExample (inside OnRxBuf)

procedure TForm1.ComPort1RxBuf(Sender: TObject; const Buffer; Count: Integer);
begin
// application does not have to read data from input buffer
// data is already in buffer parameter
HandleData(Buffer, Count); // handle data

end;


Помогите, пожалуйста.
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015566
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Hadroran
defecator,

Нет, простите, закрылись, а вопросы остались.
А получить данные теперь то как? Если со строкой все понятно было, то теперь, я так понял, надо изменить свойство
Код: pascal
1.
TriggersOnRxChar := false;



и соответственно читать событие
Код: plaintext
 OnRxBuf(Sender: TObject; const Buffer; Count: Integer); 
Но как? Есть метод
Код: plaintext
 function Read(var Buffer; Count: Integer): Integer; 
но не соображу, как его использовать, т.к. еще и справка запутала.
авторExample (inside OnRxBuf)

procedure TForm1.ComPort1RxBuf(Sender: TObject; const Buffer; Count: Integer);
begin
// application does not have to read data from input buffer
// data is already in buffer parameter
HandleData(Buffer, Count); // handle data

end;


Помогите, пожалуйста.

а ты вообще демки смотрел ?

Код: pascal
1.
2.
3.
4.
5.
6.
7.
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str: String;
begin
  ComPort.ReadStr(Str, Count);
  Memo.Text := Memo.Text + Str;
end;



для обработчика onRxBuf всё аналогично, только метод ComPort.Read:
Код: pascal
1.
function Read(var Buffer; Count: Integer): Integer;



соответственно, выделяешь буфер размером Count, и передаёшь его в ComPort.Read
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015576
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
defecator,

В демках при использовании события ComPortRxChar(Sender: TObject; Count: Integer); при внутренней расшифровке получается, что если в ответе найден байт = $00, все следующее игнорируется и получается, что ответ в строке получается неполный.
А вот с этим
defecatorсоответственно, выделяешь буфер размером Count, и передаёшь его в ComPort.Read

что-то не получается ни с одним вариантом.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
procedure TForm1.ComPortRxBuf(Sender: TObject; const Buffer; Count: Integer);
var
    ReadBuf: TBytes;
//    ReadBuf: array of byte;
//    ReadBuf: array [1..10] of byte;
begin
  ComPort.Read(ReadBuf, 10);
end;
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015582
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В топике выше читать, что в принципе не имеет особого значения.
Код: pascal
1.
ComPort.Read(ReadBuf[0], Length(ReadBuf));
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015585
goldmi45
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hadroran,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure TMainForm.VaComm1RxChar(Sender: TObject; Count: Integer);
var
  aBuffer: array [1..128] of byte;
  m: Byte;
  i: Integer;
  BufRead: String;
begin
  FillChar(aBuffer, SizeOf(aBuffer), 0);
  m := VaComm1.ReadBuf(aBuffer,Count);
  if (m > 0) then
  begin
    BufRead := '';
    for i:=1 to m do
      BufRead := BufRead + IntToHex(aBuffer[i], 2);

    mTxRx.Lines.Add('<- Rx: ' + BufRead); // mTxRx: TMemo
  end;
end;
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015601
Hadroran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
goldmi45
Hadroran,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure TMainForm.VaComm1RxChar(Sender: TObject; Count: Integer);
var
  aBuffer: array [1..128] of byte;
  m: Byte;
  i: Integer;
  BufRead: String;
begin
  FillChar(aBuffer, SizeOf(aBuffer), 0);
  m := VaComm1.ReadBuf(aBuffer,Count);
  if (m > 0) then
  begin
    BufRead := '';
    for i:=1 to m do
      BufRead := BufRead + IntToHex(aBuffer[i], 2);

    mTxRx.Lines.Add('<- Rx: ' + BufRead); // mTxRx: TMemo
  end;
end;



Всем Спасибо, то что надо.
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015654
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
goldmi45
Hadroran,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
procedure TMainForm.VaComm1RxChar(Sender: TObject; Count: Integer);
var
  aBuffer: array [1..128] of byte;
  m: Byte;
  i: Integer;
  BufRead: String;
begin
  FillChar(aBuffer, SizeOf(aBuffer), 0);
  m := VaComm1.ReadBuf(aBuffer,Count);
  if (m > 0) then
  begin
    BufRead := '';
    for i:=1 to m do
      BufRead := BufRead + IntToHex(aBuffer[i], 2);

    mTxRx.Lines.Add('<- Rx: ' + BufRead); // mTxRx: TMemo
  end;
end;



если будет больше 128-ми байт в буфере, получишь проблемы.
Буфер надо выделять размером с Count
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
procedure TMainForm.VaComm1RxChar(Sender: TObject; Count: Integer);
var
  aBuffer : TBytes ;
  m : byte ;
begin
  SetLength(aBuffer, Count) ;
  { буфер можно и не очищать, но раз уж так сильно хочется...}
  FillChar(aBuffer[0], Length(aBuffer) ;
  { m - число реально принятых байт в буфере }
  m := VaComm1.ReadBuf(aBuffer[0], Count) ;
  { опционально, можно и не переустанавливать размер 
    но тогда надо работать уже не с Count, а с M}
  if m < Count then SetLength(aBuffer, m) ;
  { далее что-то делаем с принятым буфером }
end ;
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015689
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странные какие-то примеры чтения из СОМ-порта. А что если порт начнёт выдавать по одному байту (буфер FIFO выключили)? А в норме порт даёт по 15 байт!
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015698
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
DmSer
Странные какие-то примеры чтения из СОМ-порта. А что если порт начнёт выдавать по одному байту (буфер FIFO выключили)? А в норме порт даёт по 15 байт!


порт может давать сколько угодно, но софтина работает с портом через его драйвер
а у драйвера могут быть свои виды на размер отдаваемых данных

поэтому функция VaComm1.ReadBuf возвращает число реально принятых байтов.
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015740
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DmSer
А в норме порт даёт по 15 байт!

Нет такого правила. Можно настроить таймаут после которого буфер "выплевывается".
И там вполне могут быть все 4096 байт.
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015852
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
wadman
DmSer
А в норме порт даёт по 15 байт!

Нет такого правила. Можно настроить таймаут после которого буфер "выплевывается".
И там вполне могут быть все 4096 байт.


+100500
Картинка специально для DmSer
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015878
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где гарантия, что обработчик VaComm1RxChar не вызовется в середине принимаемого пакета?
...
Рейтинг: 0 / 0
Проблема с переводом 00 в символ для отправки в COM порт
    #40015883
DmSer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя если речь о пакете из 7 байт, то приведённых примеров достаточно. Сложно представить ситуацию, когда эти байты не считаются за один вызов обработчика.
Мои замечания относятся к случаю, когда принимается пакет из нескольких десятков / сотен байтов. В этом случае не обойтись без дополнительного буфера, в который придется складывать принятые куски.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Проблема с переводом 00 в символ для отправки в COM порт
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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