1

Добрый день, уважаемые Коллеги.

Возникли проблемы при работе с RS485 (плата PCI-1602B - двухголовая).
Нет приема.
Может кто- нибудь работал с этой платой или что подскажет или какие-нибудь исходники скинет.
Может не совсем корректно проинициализировал плату ?
Заранее благодарю за помощь и внимание.

У платы две головы. Я соединил выход одной с входом другой и наоборот.
Передающая пишет в порт по 5 байт (write) с интервалом.

Приемная должна читать по 5 байт (read).



void open_dev()
{
    struct termios m_termios;
    int j,status;
    m_port.primary =open("/dev/ttyAP0",O_RDWR|O_NDELAY|O_NOCTTY);

    if(m_port.primary < 0) {
    printf("/dev/ttyAP0 Open BAD !!!\n")  ;
        exit(-1);
    }
    printf("/dev/ttyAP0 Open Ok !!!\n")  ;

    if(tcgetattr(m_port.primary, &m_termios)==-1) {
    printf("/dev/ttyAP0 ERROR GETATTR !!!\n");
    }

    m_termios.c_cflag |= ( CREAD | CLOCAL | HUPCL  );
    m_termios.c_cflag &= ~CSIZE; /* Mask the character size bits */
    m_termios.c_cflag |= CS8;    /* Select 8 data bits */
    m_termios.c_cflag &= ~PARENB;
    m_termios.c_cflag &= ~CSTOPB;

    cfsetispeed(&m_termios,B115200);
    cfsetospeed(&m_termios,B115200);


     m_termios.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); //Raw input

    m_termios.c_iflag &= ~( IXON | IXANY | IXOFF ) ;

    m_termios.c_oflag &= ~OPOST;

    tcflush(m_port.primary,TCIOFLUSH);

    if(tcsetattr(m_port.primary,TCSANOW,&m_termios)==-1) {
    printf("/dev/ttyAP0 ERROR SETATTR !!!\n");
    }

}

2 (08.12.2013 01:54:23 отредактировано vic5710)

А где запись - чтение ?
Я с такими платами работал (4 порта) всегда делал проверку на open && read или вы можете писать в несуществующее устройство
ls /dev/ttyAP* сначала

int rx = open("/dev/ttyАP1",O_RDWR | O_NONBLOCK);
if (rx < 0 ) {
 perror("open");
 return -1;
}
char buf[4096];
int count = read(rx,buf,4096);
if (count < 0) {
 perror("read");
 return -1;
}
//int tx - аналогично rx
// termios set there 
/* 
 struct termios ts_new;
     memset(&ts_new,0,sizeof(ts_new));
     ts_new.c_cflag |= ( B115200 | CS8 | CREAD | CLOCAL | HUPCL);
     ts_new.c_cflag &= ~(CRTSCTS | PARENB | PARODD);
     ts_new.c_iflag &= ~(IXON | IXOFF | IUCLC | IGNCR | ICRNL | ISTRIP | INLCR);
     ts_new.c_lflag &= ~(ICANON | ECHO);
     ts_new.c_oflag = 0;
     ts_new.c_cc[VMIN] = 0;
     ts_new.c_cc[VTIME] = 0;
    tcsetattr(rx,TCSANOW,&ts_new);
    tcsetattr(tx,TCSANOW,&ts_new);
 //вроде tcsetattr ошипку не возвращает, для проверки надо tcgetattr;
*/
char* msg ="Hello";
count = write(tx,msg,strlen(msg));
if (count < 0) { perror("write tx"); return -1;}
//delay
sleep(1);
count = read(rx,buf,sizeof(buf));
if (count < 0) { perror(" read rx");return -1;}
write(1,buf,count);

как-то так