>куски кода в студию, будем думать :) Вроде ничего не забыл.
// Код открытия порта
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)
все равно не работает.