Здравствуйте, уважаемые форумчане.
Написал простенькую программу на 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).
Здравствуйте, Ellipsoid, Вы писали:
E> Оказалось, ошибка была в использовании AnsiString в роли буфера.
E> Заменил на классический array of Byte — всё заработало.
Достаточно было Pointer(s)^