J'ai un probleme d'interfaçage via port série d'un materiél numérique...
Voici le protocol correct... (WRITE pour écriture et READ pour lecture)
WRITE 02
READ 10
WRITE 01 00 03 02 10 03
READ 10 02
WRITE 10
READ 01 00 3A 02 ... 10 03
WRITE 10 02
READ 10
Voici malheureusement le meilleur résultat que je puisse obtenir
WRITE 02
READ 66
WRITE 01 00 03 02 10 03
Bref je ne vais pas bien loin...
Je sais que mon problème se trouve dans la définition de la communication (vitesse, parite, stop bits...)
Quelqu'un peut-il me dire comment me sortir de ce mauvais pas?
A titre indicatif... Voici le code qui gère la communication serielle
static int fd = 0;
static struct termios saved_termios;
int OpenAdrPort(char* sPortNumber)
{
char sPortName[64];
sprintf(sPortName, "/dev/%s", sPortNumber);
if (fd != 0)
{
CloseAdrPort(fd);
}
fd = open(sPortName, O_RDWR | O_NOCTTY);// | O_NDELAY
if (fd < 0)
{
printf("open error %d %s\n", errno, strerror(errno));
}
else
{
struct termios my_termios;
tcgetattr(fd, &saved_termios);
memcpy(&my_termios, &saved_termios, sizeof(struct termios));
my_termios.c_cflag = CS8 | CLOCAL | CWRITE | CRTSCTS;
my_termios.c_iflag = IGNPAR;
my_termios.c_oflag = 0;
my_termios.c_lflag = 0;
my_termios.c_cc[VINTR] = 0;
my_termios.c_cc[VQUIT] = 0;
my_termios.c_cc[VERASE] = 0;
my_termios.c_cc[VKILL] = 0;
my_termios.c_cc[VEOF] = 4;
my_termios.c_cc[VTIME] = 0;
my_termios.c_cc[VMIN] = 1;
my_termios.c_cc[VSWTC] = 0;
my_termios.c_cc[VSTART] = 0;
my_termios.c_cc[VSTOP] = 0;
my_termios.c_cc[VSUSP] = 0;
my_termios.c_cc[VEOL] = 0;
my_termios.c_cc[VREPRINT] = 0;
my_termios.c_cc[VDISCARD] = 0;
my_termios.c_cc[VWERASE] = 0;
my_termios.c_cc[VLNEXT] = 0;
my_termios.c_cc[VEOL2] = 0;
tcflush(fd, TCIOFLUSH);
cfsetospeed(&my_termios, B19200);
cfsetispeed(&my_termios, B19200);
if (tcsetattr(fd, TCSANOW, &my_termios) != 0)
{
return -1;
}
}
return fd;
}
int WriteAdrPort(void* psOutput, int iSize)
{
int iOut;
if (fd < 1)
{
printf(" port is not open\n");
return -1;
}
tcflush(fd, TCIOFLUSH);
iOut = write(fd, psOutput, iSize);
if (iOut < 0)
{
printf("write error %d %s\n", errno, strerror(errno));
}
else
{
int i;
const char * Buf = psOutput;
printf("<\t");
for (i = 0; i < iOut; ++i)
{
printf("%02X ", Buf[i]);
}
printf("\n");
fflush(stdout);
}
return iOut;
}
int ReadAdrPort(void* psResponse, int iMax)
{
int iIn;
int iBuf = iMax;
void* Buf;
int retval;
fd_set rfds;
struct timeval tv;
if (fd < 1)
{
printf(" port is not open\n");
return -1;
}
Buf = psResponse;
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
tv.tv_sec = 5;
tv.tv_usec = 0;
while (iMax > 0)
{
retval = select(16, &rfds, NULL, NULL, &tv);
iIn = read(fd, Buf, iMax);
if (iIn < 0)
{
if (errno == EAGAIN)
{
return 0;
}
else
{
printf("read error %d %s\n", errno, strerror(errno));
return -1;
}
}
else
{
Buf += iIn;
iMax -= iIn;
}
}
int i;
const char * Buff = psResponse;
printf(">\t");
for (i = 0; i < iBuf; ++i)
{
printf("%02X ", Buff[i]);
}
printf("\n");
fflush(stdout);
return iIn;
}
void CloseAdrPort()
{
if (fd > 0)
{
tcflush(fd, TCIOFLUSH);
if (tcsetattr(fd, TCSANOW, &saved_termios) != 0)
{
return -1;
}
close(fd);
}
}
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.