M
Mega
Программа под QNX опрашивала приборы по RS-485 интерфесу через конвертор RS-232 - RS-485. Соответственно инициализировался порт работающий по RS-232 интерфейсу. Поставили мултипортовую плату DFLEX. На ней уже есть порт не требующий преобразования сигнала. Программа прекратила вести какой либо обмен. Вернее он есть только после запроса приходит ответ равный запросу.
Вообщем я предполагаю что нужна другая инициализация данного порта. Хотелось бы получитить какие либо коментарию по данному факту и и было бы просто превосходно, что врятли, если кто либо укажет источник где есть примеры по реализации драйвера под QNX работаюшему по RS-485
Вот код инициализации из той программы:
int m_fd; // файловый дескриптор
bool OpenCOMM(struct SComPort *config)
{
if ((m_fd=open(config->Port, O_RDWR|O_NONBLOCK|O_NOCTTY|O_BINARY))<0)
return false;
if (!SetCOMM(config))
return false;
return true;
}
bool SetCOMM(struct SComPort *config)
{
int flags;
int i;
struct termios attr;
// получить параметры устройства
if (tcgetattr(m_fd,&attr)<0)
{
close(m_fd);
return false;
}
attr.c_iflag&=~TC_IPOSIX;
attr.c_oflag&=~TC_OPOSIX;
attr.c_cflag&=~(TC_CPOSIX|TC_LPOSIX);
attr.c_iflag|=IGNBRK;
attr.c_qflag&=~(TC_PROTECT_HFLOW|TC_PROTECT_SFLOW|TC_WAIT_SFLOW|TC_ECHOI);
attr.c_cflag|=CREAD;
if (config->StopBits>1)
attr.c_cflag|=CSTOPB;
switch(config->Parity)
{
case 0:
break; // none
case 1:
attr.c_cflag|=PARENB|PARODD;
break; // odd
case 2:
attr.c_cflag|=PARENB;
break; // even
case 3:
attr.c_cflag|=PARENB|PARODD|PARSTK;
break; // mark
case 4:
attr.c_cflag|=PARENB|PARSTK;
break; // space
}
switch(config->ByteSize)
{
case 5:
attr.c_cflag|=CS5;
break;
case 6:
attr.c_cflag|=CS6;
break;
case 7:
attr.c_cflag|=CS7;
break;
case 8:
attr.c_cflag|=CS8;
break;
}
// режимы последовательного устройства
attr.c_lflag&=~(ICANON|ECHO|ECHOE|ECHOK|ISIG);
// специальные символы
for (i=0;i<NCCS;i++)
attr.c_cc=_POSIX_VDISABLE;
// attr.c_cc[VSTART]=0x11;attr.c_cc[VSTOP]=0x13; // для программного управления потоком
// контроль времени для read() - возврат немедленно
attr.c_cc[VMIN]=0;
attr.c_cc[VTIME]=0;
cfsetispeed(&attr,config->BaudRate); // скорость
cfsetospeed(&attr,config->BaudRate);
// режим записи
tcflush(m_fd,TCIOFLUSH);
if (tcsetattr(m_fd,TCSANOW,&attr)<0)
{
close(m_fd);
return false;
}
// сбросить O_NONBLOCK если устройство помнит об этом
flags=fcntl(m_fd,F_GETFL,0);
if (flags<0)
{
close(m_fd);
return false;
}
if (fcntl(m_fd,F_SETFL,flags& ~O_NONBLOCK)<0)
{
close(m_fd);
return false;
}
tcflush(m_fd,TCIOFLUSH);
return true;
}
Вообщем я предполагаю что нужна другая инициализация данного порта. Хотелось бы получитить какие либо коментарию по данному факту и и было бы просто превосходно, что врятли, если кто либо укажет источник где есть примеры по реализации драйвера под QNX работаюшему по RS-485
Вот код инициализации из той программы:
int m_fd; // файловый дескриптор
bool OpenCOMM(struct SComPort *config)
{
if ((m_fd=open(config->Port, O_RDWR|O_NONBLOCK|O_NOCTTY|O_BINARY))<0)
return false;
if (!SetCOMM(config))
return false;
return true;
}
bool SetCOMM(struct SComPort *config)
{
int flags;
int i;
struct termios attr;
// получить параметры устройства
if (tcgetattr(m_fd,&attr)<0)
{
close(m_fd);
return false;
}
attr.c_iflag&=~TC_IPOSIX;
attr.c_oflag&=~TC_OPOSIX;
attr.c_cflag&=~(TC_CPOSIX|TC_LPOSIX);
attr.c_iflag|=IGNBRK;
attr.c_qflag&=~(TC_PROTECT_HFLOW|TC_PROTECT_SFLOW|TC_WAIT_SFLOW|TC_ECHOI);
attr.c_cflag|=CREAD;
if (config->StopBits>1)
attr.c_cflag|=CSTOPB;
switch(config->Parity)
{
case 0:
break; // none
case 1:
attr.c_cflag|=PARENB|PARODD;
break; // odd
case 2:
attr.c_cflag|=PARENB;
break; // even
case 3:
attr.c_cflag|=PARENB|PARODD|PARSTK;
break; // mark
case 4:
attr.c_cflag|=PARENB|PARSTK;
break; // space
}
switch(config->ByteSize)
{
case 5:
attr.c_cflag|=CS5;
break;
case 6:
attr.c_cflag|=CS6;
break;
case 7:
attr.c_cflag|=CS7;
break;
case 8:
attr.c_cflag|=CS8;
break;
}
// режимы последовательного устройства
attr.c_lflag&=~(ICANON|ECHO|ECHOE|ECHOK|ISIG);
// специальные символы
for (i=0;i<NCCS;i++)
attr.c_cc=_POSIX_VDISABLE;
// attr.c_cc[VSTART]=0x11;attr.c_cc[VSTOP]=0x13; // для программного управления потоком
// контроль времени для read() - возврат немедленно
attr.c_cc[VMIN]=0;
attr.c_cc[VTIME]=0;
cfsetispeed(&attr,config->BaudRate); // скорость
cfsetospeed(&attr,config->BaudRate);
// режим записи
tcflush(m_fd,TCIOFLUSH);
if (tcsetattr(m_fd,TCSANOW,&attr)<0)
{
close(m_fd);
return false;
}
// сбросить O_NONBLOCK если устройство помнит об этом
flags=fcntl(m_fd,F_GETFL,0);
if (flags<0)
{
close(m_fd);
return false;
}
if (fcntl(m_fd,F_SETFL,flags& ~O_NONBLOCK)<0)
{
close(m_fd);
return false;
}
tcflush(m_fd,TCIOFLUSH);
return true;
}