Delphi + запись в COM-порт
От: Ellipsoid  
Дата: 22.08.22 13:45
Оценка:
Здравствуйте, уважаемые форумчане.

Написал простенькую программу на Delphi:
{$APPTYPE CONSOLE}
program wr;

uses Windows;

var
  port: THandle;
  cfg: TDCB;

  s: AnsiString;
  n: Cardinal;

begin
  port := CreateFile(
    'COM4',
    GENERIC_READ or GENERIC_WRITE,
    0,
    nil,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    0
  );
  cfg.DCBlength := SizeOf(TDCB);
  cfg.BaudRate := 9600;
  cfg.ByteSize := 8;
  cfg.Parity := NoParity;
  cfg.StopBits := OneStopBit;
  cfg.Flags := 0;
  SetCommState(port, cfg);

  s := #$01#$02#$03#$04#$05;
  WriteFile(port, s, Length(s), n, nil);
  WriteLn(n);

  CloseHandle(port);
  ReadLn;
end.

Она открывает COM4 и пишет туда строку размером в 5 байт: 01 02 03 04 05.
Однако, на принимающей стороне, приходят байты: 0C 00 41 00 00.
Подскажите, в чём может быть дело? Порт открывается в режиме 8N1 9600 бод.

На принимающей стороне читаю так:
#include <stdio.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdint.h>
#include <sys/ioctl.h>

int main(int argc, char **argv) {

  int fd, n;
  struct termios options;

        const char *fn = "/dev/ttyUSB0";
  if (argc > 1) fn = argv[1];
  fd = open(fn, O_RDWR | O_NOCTTY);
  if (fd < 0) {
    printf("Unable to open %s\n", fn);
    return -1;
  }

  fcntl(fd, F_SETFL, FNDELAY);
  tcgetattr(fd, &options);
  cfsetspeed(&options, B9600);
  options.c_iflag = 0;
  options.c_oflag = 0;
  options.c_lflag = 0;
  options.c_cflag = 0 ;
  options.c_cflag = CS8;
  options.c_cc[VMIN] = 0;
  options.c_cc[VTIME] = 0;
  tcsetattr(fd, TCSANOW, &options);

  printf("\n");
  unsigned char c;
  for (;;) {
    int n = read(fd, &c, 1);
    if (n > 0)
    printf(" %02X\n", c);
  }
  printf("\n");

  close(fd);
  return 0;
}

Физически, приём-передача ведётся через обычные FT232R (USB).
Re: Delphi + запись в COM-порт
От: BlackEric http://black-eric.lj.ru
Дата: 22.08.22 14:10
Оценка:
Здравствуйте, Ellipsoid, Вы писали:

1. Убедиться, что вы пишете и читаете в один и тот же порт.
2. С обоих сторон поднять терминалы и добиться работы через них.
3. Потом одну из сторон заменить своим приложением и добиться работы.
4. Потом запустить в работу второе приложение.

В общем для начала поймите с какой стороны проблема.
https://github.com/BlackEric001
Re[2]: Delphi + запись в COM-порт
От: Ellipsoid  
Дата: 23.08.22 06:21
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>2. С обоих сторон поднять терминалы и добиться работы через них.

BE>В общем для начала поймите с какой стороны проблема.

Заменил виндовую часть на терминал — стали передаваться правильные данные.

Оказалось, ошибка была в использовании AnsiString в роли буфера.
Заменил на классический array of Byte — всё заработало.

Спасибо за подсказки.
Re[3]: Delphi + запись в COM-порт
От: rudzuk  
Дата: 23.08.22 08:57
Оценка:
Здравствуйте, Ellipsoid, Вы писали:

E> Оказалось, ошибка была в использовании AnsiString в роли буфера.

E> Заменил на классический array of Byte — всё заработало.

Достаточно было Pointer(s)^
avalon/3.0.1
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.