задача выдать в сом порт 8 байт и считать из порта, приходящие через 100 мс, 12 байтов
сом порт принимает только эхо выданного
/*mn.c*/
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include <sys/ioctl.h>
int main(int ARGC, char *ARGV[])
{
int mainfd=0;
struct termios options;
mainfd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if (mainfd == -1)
{
fprintf(stderr, "Невозможно открыть /dev/ttyUSB0 - %s\n",strerror(errno));
return -1;
}
fcntl(mainfd, F_SETFL, FNDELAY);
tcgetattr(mainfd, &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_cflag &= ~PARENB;
options.c_cflag |= ~PARODD;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~CRTSCTS;
options.c_lflag &= ~(ICANON | ECHO | ISIG);
tcsetattr(mainfd, TCSANOW, &options);
int i;
unsigned char bufWR[8] = {0x80,0x58,0xF1,0x00,0x01,0x18,0x01,0xE2};
unsigned char bufRD[16] = {0};
ioctl(mainfd, TIOCCBRK, 0); //установить линию в единицу
usleep(300000); //на 300 мс
ioctl(mainfd, TIOCSBRK, 0); //сброс линии в ноль
usleep(25000); //на 25 мс
ioctl(mainfd, TIOCCBRK, 0); //установить линию в единицу
usleep(25000); //на 25 мс
for(i=0; i<8; i++)
{
write(mainfd, &bufWR[i], 1); //запись в порт 8 байт
usleep(10000); //задержка на 10 мс
}
usleep(80000);
read(mainfd, bufRD, 12); //чтение из порта 12 байт
int m;
printf("Записано в порт:");
for (m=0; m < 8; m++)
{
printf(" %x ", bufWR[m]);
}
printf("\n");
int k;
printf("Получено из порта:");
for (k=0; k < 15; k++)
{
printf(" %x ", bufRD[k]);
}
printf("\n");
close(mainfd);
}
d630@d630:~$ ./mn
Записано в порт: 80 58 f1 0 1 18 1 e2
Получено из порта: 0 80 58 f1 0 1 18 1 e2 0 0 0 0 0 0
d630@d630:~$
скриншот с осциллографа
решено:
задержка перед приемом должна быть не менее реальной задержки (в данном случае равной 100 мс), в программе было выставлено 80 мс, изменил на 100 мс и все заработало