Forum Programmation.c Problème Interface série

Posté par  .
Étiquettes : aucune
0
20
mai
2007
Bonjour,

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.