LinuxForum.Fans
Тема

RS485 (плата PCI1602B)

Автор: plica98 2 сообщений 2007 просмотров
#295691

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

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

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

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

text

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"); }

}

#353523

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

text

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);

как-то так

Войдите или зарегистрируйтесь, чтобы ответить.