Что бы народ не трахался с корретной настройкой raw режима. Долой танцы с бубном! Я понимаю что для всех гуру это очевидно, но я надеюсь что FAQ не только для гуру. Необходимо поддержать начинающих программеров. Исходник используется для обеспечения связи по СОМ порту с промышленными железками. Понимаю, что исходник не без недостатков. Но тогда пусть ктонить улучшить его или преложит альтернативный работающий вариант для начинающих программеров протоколов для СОМ портов. //start #define TO_B110 3200000 /* These values are the timeout delays */ #define TO_B300 1600000 /* at the end of packets of data. */ #define TO_B600 800000 /* At this stage a true calculation */ #define TO_B1200 400000 /* has not been worked out. So these */ #define TO_B2400 200000 /* values are just a guess. */ #define TO_B4800 100000 /* */ #define TO_B9600 50000 /* The spec says that a message frame */ #define TO_B19200 25000 /* starts after a silent interval of */ #define TO_B38400 12500 /* at least 3.5 character times. */ #define TO_B57600 8333 /* These are uS times. */ #define TO_B115200 4167 int set_up_comms( char *device, int baud_i, char *parity, int stopb ) { int ttyfd; struct termios settings; int char_interval_timeout; speed_t baud_rate; if(( ttyfd = open( device,(O_RDWR | O_NOCTTY | O_NONBLOCK | O_BINARY) ) ) < 0 ) { printf("ERROR: set_up_comms: %s\n",strerror(errno)); return(-1); } tcgetattr(ttyfd,&settings); #ifdef DEBUG fprintf( stderr, "opening %s\n", device ); #endif switch( baud_i ) { case 110: baud_rate = 110; char_interval_timeout = TO_B110; break; case 300: baud_rate = 300; char_interval_timeout = TO_B300; break; case 600: baud_rate = 600; char_interval_timeout = TO_B600; break; case 1200: baud_rate = 1200; char_interval_timeout = TO_B1200; break; case 2400: baud_rate = 2400; char_interval_timeout = TO_B2400; break; case 4800: baud_rate = 4800; char_interval_timeout = TO_B4800; break; case 9600: case 0: baud_rate = 9600; //baud_rate = B9600; char_interval_timeout = TO_B9600; //char_interval_timeout = 9600; break; case 19200: baud_rate = 19200; char_interval_timeout = TO_B19200; break; case 38400: baud_rate = 38400; char_interval_timeout = TO_B38400; break; case 57600: baud_rate = 57600; char_interval_timeout = TO_B57600; break; case 115200: baud_rate = 115200; char_interval_timeout = TO_B115200; break; default: baud_rate = 9600; char_interval_timeout = TO_B9600; fprintf(stderr, "Unknown baud rate %d for %s.", baud_i, device); } #ifdef DEBUG fprintf( stderr, "%s open\n", device ); #endif cfsetispeed( &settings, baud_rate );/* Set the baud rate */ cfsetospeed( &settings, baud_rate ); settings.c_cflag &=~ CSIZE; settings.c_cflag |= CS8; if(stopb==1) settings.c_cflag &=~ CSTOPB;//one STOP BIT else settings.c_cflag |= CSTOPB;//two STOP BIT if( strncmp( parity, "none", 4 ) == 0 ) { settings.c_cflag &=~ PARENB; settings.c_cflag &=~ PARODD; } else if( strncmp( parity, "even", 4 ) == 0 ) { settings.c_iflag |= (INPCK); settings.c_iflag &= ~(IGNPAR | ISTRIP | PARMRK); settings.c_cflag |= PARENB; settings.c_cflag &=~ PARODD; } else { settings.c_iflag |= (INPCK); settings.c_iflag &= ~(IGNPAR | ISTRIP | PARMRK); settings.c_cflag |= PARENB; settings.c_cflag |= PARODD; } settings.c_cflag &= ~IHFLOW; settings.c_cflag &= ~OHFLOW; settings.c_cflag &= ~HUPCL; settings.c_cflag &= ~CLOCAL; //-----------Off Flow Control Flags #ifndef QNX6 settings.c_qflag &= ~(TC_PROTECT_HFLOW|TC_PROTECT_SFLOW|TC_WAIT_SFLOW|TC_ECHOI); #endif //---Set Flag -ohpaged tcflow(ttyfd, TCOONHW); settings.c_cc[VMIN] = 1; settings.c_cc[VTIME] = 0; if( tcsetattr( ttyfd, TCSANOW, &settings ) < 0 ) { fprintf( stderr, "tcsetattr failed\n"); exit( 1 ); } tcflush(ttyfd, TCIOFLUSH); return( ttyfd ); } //end
Ответ на:
комментарий
от fagot
Ответ на:
комментарий
от binr
Ответ на:
комментарий
от stassats
Ответ на:
комментарий
от binr
Ответ на:
комментарий
от stassats
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Правильно ли я открываю СОМ порт? ХХХХХХХЕЕЕЕЕЛЛЛЛЛППППППП!!!!!!!!!!! (2004)
- Форум Раньше работал СОМ порт, теперь не работает помогите разобраться.! HELP!!!!!!!!! (2004)
- Форум Проблема установок параметров СОМ порта. (2005)
- Форум [C++]Программирование c Alsa с постоянным underrun (2012)
- Форум X-Window (2009)
- Форум Com-port странное поведение программы (2011)
- Форум C Оптимизация алгоритма чтение данных с компорта (2011)
- Форум Нужно добавить СОМ-портов (2001)
- Форум Alsa программирование (2013)
- Форум помогите найти ошибки в следующем перловом коде (2004)