The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Не работает чтение из Com порта под linux"
Отправлено marty, 05-Фев-09 14:01 

>куски кода в студию, будем думать :)

Вроде ничего не забыл.

// Код открытия порта
        fSerial = :: open( MARTY_CON_NS w2ansi(sysDeviceName).c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
        if (fSerial==-1)
           return CLI_SET_POSIX_ERROR_INFO_ARGS( errno, 0, 0, (::cli::format::arg(streamNameInfo) ) );


// код настройки порта

            tcflush(fSerial, TCIOFLUSH);

            #define TIOS_SETSPEED( opts, val ) do { cfsetispeed( opts, val ); cfsetospeed( opts, val ); } while(0)
            struct termios tios;
            if ( tcgetattr( fSerial, &tios ) <0 )
               return CLI_SET_POSIX_ERROR_INFO( errno, 0, 0 );

            switch(options->baudRate)
               {
                case 50     : TIOS_SETSPEED( &tios, B50      ); break;    case 75     : TIOS_SETSPEED( &tios, B75      ); break;
                case 110    : TIOS_SETSPEED( &tios, B110     ); break;    case 134    : TIOS_SETSPEED( &tios, B134     ); break;
                case 150    : TIOS_SETSPEED( &tios, B150     ); break;    case 200    : TIOS_SETSPEED( &tios, B200     ); break;
                case 300    : TIOS_SETSPEED( &tios, B300     ); break;    case 600    : TIOS_SETSPEED( &tios, B600     ); break;
                case 1200   : TIOS_SETSPEED( &tios, B1200    ); break;    case 1800   : TIOS_SETSPEED( &tios, B1800    ); break;
                case 2400   : TIOS_SETSPEED( &tios, B2400    ); break;    case 4800   : TIOS_SETSPEED( &tios, B4800    ); break;
                case 9600   : TIOS_SETSPEED( &tios, B9600    ); break;    case 19200  : TIOS_SETSPEED( &tios, B19200   ); break;
                case 38400  : TIOS_SETSPEED( &tios, B38400   ); break;    case 57600  : TIOS_SETSPEED( &tios, B57600   ); break;
                case 115200 : TIOS_SETSPEED( &tios, B115200  ); break;    case 230400 : TIOS_SETSPEED( &tios, B230400  ); break;
                case 460800 : TIOS_SETSPEED( &tios, B460800  ); break;    case 500000 : TIOS_SETSPEED( &tios, B500000  ); break;
                case 576000 : TIOS_SETSPEED( &tios, B576000  ); break;    case 921600 : TIOS_SETSPEED( &tios, B921600  ); break;
                case 1000000: TIOS_SETSPEED( &tios, B1000000 ); break;    case 1152000: TIOS_SETSPEED( &tios, B1152000 ); break;
                case 1500000: TIOS_SETSPEED( &tios, B1500000 ); break;    case 2000000: TIOS_SETSPEED( &tios, B2000000 ); break;
                case 2500000: TIOS_SETSPEED( &tios, B2500000 ); break;    case 3000000: TIOS_SETSPEED( &tios, B3000000 ); break;
                case 3500000: TIOS_SETSPEED( &tios, B3500000 ); break;    case 4000000: TIOS_SETSPEED( &tios, B4000000 ); break;
                //case : TIOS_SETSPEED( &tios, B ); break;
                default:     return CLI_SET_ERROR_INFO_ARGS( EC_SERIAL_BAUD_NOT_SUPPORTED, 0, 0, (::cli::format::arg((UINT)options->baudRate) ) );
               }

            #undef TIOS_SETSPEED

            tios.c_cflag &= ~(CSIZE|CSTOPB|CLOCAL|CREAD|PARENB|PARODD);
            #ifdef CMSPAR
            tios.c_cflag &= ~CMSPAR;
            #endif
            //tios.c_iflag &= ~(CSIZE|CSTOPB|CLOCAL|CREAD|PARENB|PARODD);

            switch(options->dataBits)
               {
                case CLI_IO_SERIAL_DATABITS_DATABITS5:  tios.c_cflag |= CS5; break;
                case CLI_IO_SERIAL_DATABITS_DATABITS6:  tios.c_cflag |= CS6; break;
                case CLI_IO_SERIAL_DATABITS_DATABITS7:  tios.c_cflag |= CS7; break;
                case CLI_IO_SERIAL_DATABITS_DATABITS8:  tios.c_cflag |= CS8; break;
               }

            if ( options->stopBits == CLI_IO_SERIAL_STOPBITS_STOPBITS2)
               tios.c_cflag |= CSTOPB;

            if (options->parity&CLI_IO_SERIAL_PARITY_FPARITY)
               {
                tios.c_cflag |= PARENB; // enable parity
                tios.c_iflag |= (INPCK | ISTRIP); // Enable parity check and Strip parity bits
                if ( options->parity == CLI_IO_SERIAL_PARITY_ODD ) tios.c_cflag |= PARODD; // odd parity
                // else even
               }
/*
    case 3: // mark
        cflag |= PARENB | CMSPAR | PARODD;
        break;
    case 4: // space
        cflag |= PARENB | CMSPAR;
        break;
*/

            // I don't known why, but thats needed
            tios.c_cflag |= CLOCAL|CREAD;
            #ifdef HUPCL
            tios.c_cflag |= HUPCL;
            #endif

            // disable hardware flow control
            #if defined(CNEW_RTSCTS)
                tios.c_cflag &= CNEW_RTSCTS;
            #elif defined(CRTSCTS)
                tios.c_cflag &= CRTSCTS;
            #endif

            // Choosing Raw Input - clear flags
            tios.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

            // turn software flow control off
            tios.c_iflag &= ~(IXON | IXOFF | IXANY);

            // clear Mark parity errors
            tios.c_iflag &= ~(PARMRK);

            // Ignore parity errors - high level protocol must check incoming data
            tios.c_iflag |= IGNPAR;

            // Choosing Raw Output - clear flags
            //tios.c_oflag &= ~OPOST;
            tios.c_oflag = 0; // When the OPOST option is disabled, all other option bits in c_oflag are ignored.

            tios.c_cc[VMIN]  = 1;
            tios.c_cc[VTIME] = 0;

            if ( tcsetattr( fSerial, TCSANOW /* TCSAFLUSH */ , &tios ) <0 )
               return CLI_SET_POSIX_ERROR_INFO( errno, 0, 0 );

// Код чтения
        struct timeval Timeout;
        Timeout.tv_usec = (millisecTimeout%1000)*1000;  // в микросекунды
        Timeout.tv_sec  = millisecTimeout/1000;  // секунды

        //struct
        fd_set readFs;
        FD_ZERO( &readFs );
        FD_SET( fSerial, &readFs );
        printf("Call select, usec: %d, sec: %d\n", Timeout.tv_usec, Timeout.tv_sec);

        //Timeout.tv_usec = (millisecTimeout%1000)*1000;  // в микросекунды
        //Timeout.tv_sec  = millisecTimeout/1000;  // секунды


        //int selectRes = select(fSerial+1, &readFs, NULL, NULL, &Timeout );
        int selectRes = select(fSerial+1, &readFs, NULL, NULL, 0 );
        if (selectRes==-1 && errno!=EINTR) // ошибка и не сигнал
           return CLI_SET_POSIX_ERROR_INFO_ARGS( errno, 0, 0, (::cli::format::arg(streamNameInfo)) );
        printf("select res: %d\n", selectRes);

        if (selectRes==-1)
           {
            printf("selectRes==-1\n");
           }

        if (selectRes==0)
           {
            printf("selectRes==0\n");
           }

        if (!FD_ISSET( fSerial, &readFs ))
           {
            printf("!FD_ISSET( fSerial, &readFs )\n");
           }


        if (selectRes==-1 || selectRes==0 || (!FD_ISSET( fSerial, &readFs )) )
           {
            // ожидание прервано сигналом,
            // или истек таймаут или дескриптор не в наборе дескрипторов, готовых для чтения
            // возвращаем, что  ничего не прочитано
            if (numBytesReaded) *numBytesReaded = 0;
            return EC_OK;
           }

        ssize_t res = :: read(fSerial, buf, numBytesToRead);
        if (res==-1)
           {
            return CLI_SET_POSIX_ERROR_INFO_ARGS( errno, 0, 0, (::cli::format::arg(streamNameInfo)) );
           }
        if (numBytesReaded) *numBytesReaded = (SIZE_T)res;
        return EC_OK;


//------------
пробовал еще TIOS_SETSPEED по другому определить, вот так:

            #if defined(_HAVE_STRUCT_TERMIOS_C_ISPEED) && _HAVE_STRUCT_TERMIOS_C_ISPEED==1
                #define TIOS_OLD_SETISPEED( opts, val ) do { (opts)->c_ispeed = val;  } while(0)
            #else
                #define TIOS_OLD_SETISPEED( opts, val )
            #endif
            #if defined(_HAVE_STRUCT_TERMIOS_C_OSPEED) && _HAVE_STRUCT_TERMIOS_C_OSPEED==1
                #define TIOS_OLD_SETOSPEED( opts, val ) do { (opts)->c_ospeed = val;  } while(0)
            #else
                #define TIOS_OLD_SETOSPEED( opts, val )
            #endif

            #define TIOS_SETSPEED( opts, val ) do { \
                                                   TIOS_OLD_SETISPEED((opts), val);  \
                                                   TIOS_OLD_SETOSPEED((opts), val);  \
                                                    cfsetispeed( (opts), val );      \
                                                    cfsetospeed( (opts), val );      \
                                                    (opts)->c_cflag |= val;          \
                                                   } while(0)


все равно не работает.

 

Ваше сообщение
Имя*:
EMail:
Для отправки новых сообщений в текущей нити на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.

На сайте действует частичное премодерирование - после публикации некоторые сообщения от анонимов могут автоматически скрываться ботом. После проверки модератором ошибочно скрытые сообщения раскрываются. Для ускорения раскрытия можно воспользоваться ссылкой "Сообщить модератору", указав в качестве причины обращения "скрыто по ошибке".



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру