Работа порта по интерфейсу RS-485

Тема в разделе "C и С++ FAQ", создана пользователем Mega, 2 фев 2004.

Статус темы:
Закрыта.
  1. Mega

    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;
    }
     
  2. zubr

    zubr Гость

    RS-485 работает совсем не так как RS-232. В RS-485, после передачи в порт последнего байта, необходимо сбросить сигнал DTR, иначе потеряешь читающий поток.
     
Загрузка...
Похожие Темы - Работа порта по
  1. ToxaRat
    Ответов:
    23
    Просмотров:
    3.306
  2. Handsoff
    Ответов:
    9
    Просмотров:
    7.872
  3. Andrey Kha
    Ответов:
    0
    Просмотров:
    20
  4. Hoasker
    Ответов:
    0
    Просмотров:
    64
  5. garri671
    Ответов:
    0
    Просмотров:
    54
Статус темы:
Закрыта.

Поделиться этой страницей