Problem Reading Serial Port (RS485)

Started by andrea1984 May 13, 2009
Hi all,
I've a FOX Board (Linux Embedded) with RS485 port, and a Power Counter
(RS485 too) that work at 9600E1.
With a USB to RS485 cable and windows i can successfully communicate with
the Counter, writing a simple c# application. The rs485 linux board work
too (with others devices).

I can't read always correctly between the linux board and the counter, and
i don't know why. I've analyzed with an oscilloscope, and the data sent is
always correct.

Sometimes i read the correct string (/EMH5\@--DMZ-F0028T<CR><LF>) and most
of times i read something like this
(<NUL>-\<LF>*<19><5>.)<9>TJUI<28>&LY8T<CR><LF><NUL>).

I've tried different settings, none worked.
Thanks

Here is the code:

int OpenRS485()
{
    int status;
    struct rs485_ctrl ctrl485;
    char dev[] = "/dev/ttyS3";

    // Apre la porta seriale
    fd = open(dev, O_RDWR | O_NOCTTY | O_NDELAY);

    if (fd < 0)
    {
        flog("ERRORE! Apertura della porta fallita!", -2);
        printf("ERRORE! Apertura della porta fallita (%s)!\n", dev);
        return -1;
    }
    else
    {
        fcntl(fd, F_SETFL, FASYNC);
        printf("Porta seriale aperta\n");
    }

    //Imposta la porta seriale nel funzionamento 485
    ctrl485.rts_on_send = 0;
    ctrl485.rts_after_sent = 1;
    ctrl485.delay_rts_before_send = 0;
    ctrl485.enabled = 1;
    status = ioctl(fd, TIOCSERSETRS485, &ctrl485);

    if (status)
    {
        flog("ERRORE! TIOCSERSETRS485 fallita - fotomonitor.c main", -3);
        printf("ERRORE! TIOCSERSETRS485 fallita (%d)\n", status);
        close(fd);
        return -1;
    }
    else
	   printf("Porta seriale impostata in RS485\n\n");


    tcgetattr(fd, &ti_prev);     // Salva la vecchia configurazione
    tcgetattr(fd, &ti);          // Legge la vecchia configurazione
    cfsetospeed(&ti, B9600);   // Imposta la velocit&agrave; di trasmissione
    cfsetispeed(&ti, B9600);   // Imposta la velocit&agrave; di ricezione
    cfmakeraw(&ti);

    ti.c_cflag = (0|B9600|CREAD|CS7|PARENB|CLOCAL);

    if (tcsetattr(fd, TCSAFLUSH, &ti) != 0) // Imposta la nuova
configurazione
        printf("Errore nelle impostazioni RS485\n");

    return 0;
}




Sorry, i mean 9600 7E1
andrea1984 wrote:

> Sorry, i mean 9600 7E1
May be, you need a terminator consisting of 3 resistors. http://www.national.com/an/AN/AN-1057.pdf Page 5, Figure 5. best regards Stefan DF9BI
>andrea1984 wrote: > >> Sorry, i mean 9600 7E1 > >May be, you need a terminator consisting of 3 resistors. > >http://www.national.com/an/AN/AN-1057.pdf > >Page 5, Figure 5. > >best regards > >Stefan DF9BI >
Ok. I'll try.