📄 init.c
字号:
printf( "\tCBAUDEX clear: What does this do?\n" );#endif if( tp->c_cflag & CRTSCTS ) printf( "\tCRTSCTS: harware flow control enabled?\n" ); else printf( "\tCRTSCTS: hardware flow control disabled?\n" );}void print_c_cc( struct termios * tp ){ int i; char * cc_index_names [NCCS] = { "[VINTR] ", /* 0 */ "[VQUIT] ", /* 1 */ "[VERASE] ", /* 2 */ "[VKILL] ", /* 3 */ "[VEOF] ", /* 4 */ "[VTIME] ", /* 5 */ "[VMIN] ", /* 6 */ "[VSWTC ", /* 7 */ "[VSTART] ", /* 8 */ "[VSTOP] ", /* 9 */ "[VSUSP] ", /* 10 */ "[VEOL] ", /* 11 */ "[VREPRINT]", /* 12 */ "[VDISCARD]", /* 13 */ "[VWERASE] ", /* 14 */ "[VLNEXT ", /* 15 */ "[VEOL2] ", /* 16 */ "unknown ", /* 17 */ "unknown ", /* 18 */ }; for( i = 0; i < NCCS; i++ ) { printf( "c_cc%s = 0x%08x\n", cc_index_names[i], tp->c_cc[i] ); }}void print_termios( struct termios *tp ){ printf( "\nLooking at the current termios settings:\n\n" ); print_c_iflag( tp ); print_c_oflag( tp ); print_c_cflag( tp ); print_c_lflag( tp ); print_c_cc( tp ); printf( "\n" );}unsigned long get_baud_rate( void ){ unsigned long baud_rate; while( TRUE ) { printf( "Enter the numerical value for the new baud rate.\n" ); printf( "Choices are: 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800\n" ); printf( "2400, 4800, 9600, 19200, 38400, 57600, 115200, 230400, 460800\n" ); printf( "\nYour choice: " ); scanf( "%lu", &baud_rate ); printf( "\n" ); switch( baud_rate ) { case 50: return B50; case 75: return B75; case 110: return B110; case 134: return B134; case 150: return B150; case 200: return B200; case 300: return B300; case 600: return B600; case 1200: return B1200; case 1800: return B1800; case 2400: return B2400; case 4800: return B4800; case 9600: return B9600; case 19200: return B19200; case 38400: return B38400; case 57600: return B57600; case 115200: return B115200; case 230400: return B230400; case 460800: return B460800; default: printf( "%lu is not a valid choice. Try again.\n\n", baud_rate ); break; } }}unsigned long get_parity(){ int parity; while( TRUE ) { printf( "Enter the numerical value for the new parity\n" ); printf( "Choices are: 0 for no parity, 1 for even parity, 2 for odd parity\n" ); printf( "\nYour choice: " ); scanf( "%d", &parity ); printf( "\n" ); switch( parity ) { case 0: return 0; case 1: return PARENB; case 2: return PARENB | PARODD; default: printf( "%d is not a valid choice. Try again.\n\n", parity ); break; } }}unsigned long get_stop_bits(){ int stop_bits; while( TRUE ) { printf( "Enter the numerical value for the new number of stop bits\n" ); printf( "Choices are: 1 or 2\n" ); printf( "\nYour choice: " ); scanf( "%d", &stop_bits ); printf( "\n" ); switch( stop_bits ) { case 1: return 0; case 2: return CSTOPB; default: printf( "%d is not a valid choice. Try again.\n\n", stop_bits ); break; } }}unsigned long get_data_bits(){ int data_bits; while( TRUE ) { printf( "Enter the numerical value for the new number of data bits\n" ); printf( "Choices are: 5, 6, 7 or 8\n" ); printf( "\nYour choice: " ); scanf( "%d", &data_bits ); printf( "\n" ); switch( data_bits ) { case 5: return CS5; case 6: return CS6; case 7: return CS7; case 8: return CS8; default: printf( "%d is not a valid choice. Try again.\n\n", data_bits ); break; } }}void change_line_settings( struct termios *tp ){ unsigned long baud_rate, parity, stop_bits, data_bits, sleep_time; printf( "\nSetting line characteristics\n\n" ); baud_rate = get_baud_rate(); parity = get_parity(); stop_bits = get_stop_bits(); data_bits = get_data_bits(); printf( "NOTE: You will not see output until you switch your terminal settings!\n" ); printf( "WARNING: If you do not switch your terminal settings, your terminal may hang.\n" ); printf( "Enter the number of seconds the test will wait for you to switch your terminal\n" ); printf( "settings before it continues\n" ); printf( "Sleep time (in seconds): " ); scanf( "%lu", &sleep_time ); printf( "\n" ); printf( "Setting line to new termios settings in %lu seconds.\n", sleep_time ); sleep( sleep_time ); tp->c_cflag = CLOCAL | CREAD | parity | stop_bits | data_bits | baud_rate; if( tcsetattr( fileno( stdin ), TCSADRAIN, tp ) < 0 ) { perror( "change_line_settings(): tcsetattr() failed" ); rtems_test_exit( 1 ); } printf( "Line settings set.\n" );}void canonical_input( struct termios *tp ){ char c, first_time = TRUE; printf( "\nTesting canonical input\n\n" ); printf( "Setting line to canonical input mode.\n" ); tp->c_lflag = ISIG | ICANON | ECHO | ECHONL | ECHOK | ECHOE | ECHOPRT | ECHOCTL | IEXTEN; tp->c_iflag = BRKINT | ICRNL | IXON | IMAXBEL; if( tcsetattr( fileno( stdin ), TCSADRAIN, tp ) < 0 ) { perror( "canonical_input(): tcsetattr() failed" ); rtems_test_exit( 1 ); } while ( ( c = getchar () ) != '\n'); printf( "Testing getchar(). Type some text followed by carriage return\n" ); printf( "Each character you entered will be echoed back to you\n\n" ); while ( ( c = getchar () ) != '\n') { if( first_time ) { printf( "\nYou typed:\n"); first_time = FALSE; } printf( "%c", c ); } printf( "\n\nCanonical input test done.\n" );}/* * Test raw (ICANON=0) input */void do_raw_input( int vmin, int vtime ){ int i; struct termios old, new; rtems_interval ticksPerSecond, then, now; unsigned int msec; unsigned long count; int nread; unsigned char cbuf[100]; printf( "Raw input test with VMIN=%d VTIME=%d\n", vmin, vtime ); rtems_clock_get( RTEMS_CLOCK_GET_TICKS_PER_SECOND, &ticksPerSecond ); if ( tcgetattr( fileno ( stdin ), &old ) < 0 ) { perror( "do_raw_input(): tcgetattr() failed" ); return; } new = old; new.c_lflag &= ~( ICANON | ECHO | ECHONL | ECHOK | ECHOE | ECHOPRT | ECHOCTL ); new.c_cc[VMIN] = vmin; new.c_cc[VTIME] = vtime; if( tcsetattr( fileno( stdin ), TCSADRAIN, &new ) < 0 ) { perror ("do_raw_input(): tcsetattr() failed" ); return; } do { rtems_clock_get( RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &then ); count = 0; for(;;) { nread = read( fileno( stdin ), cbuf, sizeof cbuf ); if( nread < 0 ) { perror( "do_raw_input(): read() failed" ); goto out; } count++; if( nread != 0 ) break; } rtems_clock_get( RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &now ); msec = (now - then) * 1000 / ticksPerSecond; printf( "Count:%-10lu Interval:%3u.%3.3d Char:", count, msec / 1000, msec % 1000 ); for( i = 0 ; i < nread ; i++ ) printf (" 0x%2.2x", cbuf[i]); printf ("\n"); } while( cbuf[0] != 'q' ); out: if( tcsetattr( fileno( stdin ), TCSADRAIN, &old) < 0 ) perror("do_raw_input(): tcsetattr() failed: %s\n" ); printf ("*** End of Raw input VMIN=%d VTIME=%d ***\n", vmin, vtime);}static void raw_input( struct termios *tp ){ printf( "\nTesting raw input input\n\n" ); printf( "Hit 'q' to terminate the test\n" ); do_raw_input( 0, 0 ); do_raw_input( 0, 20 ); do_raw_input( 5, 0 ); do_raw_input( 5, 20 ); printf( "\nRaw input test done.\n" );}void usage( void ){ printf( "\nYou have the following choices:\n" ); printf( " 1 - Reset the struct termios\n" ); printf( " 2 - Look at the current termios setting\n" ); printf( " 3 - Change the line characteristics\n" ); printf( " 4 - Test canonical input\n" ); printf( " 5 - Test raw input\n" ); printf( " 9 - Exit\n" ); printf( "Enter your choice (1 to 5 or 9, followed by a carriage return): " );}/* * RTEMS Startup Task */rtems_taskInit (rtems_task_argument ignored){ char c ; struct termios orig_termios, test_termios; printf( "\n\n*** TEST OF TERMIOS INPUT CAPABILITIES ***\n" ); if( tcgetattr( fileno( stdin ), &orig_termios ) < 0 ) { perror( "tcgetattr() failed" ); rtems_test_exit( 0 ); } test_termios = orig_termios; usage(); for(;;) { switch( c = getchar() ) { case '1': printf( "\nResetting the line to the original termios setting\n\n" ); test_termios = orig_termios; if( tcsetattr( fileno( stdin ), TCSADRAIN, &test_termios ) < 0 ) { perror( "tcsetattr() failed" ); rtems_test_exit( 1 ); } usage(); break; case '2': print_termios( &test_termios ); usage(); break; case '3': change_line_settings( &test_termios ); usage(); break; case '4': canonical_input( &test_termios ); usage(); break; case '5': raw_input( &test_termios ); usage(); break; case '9': rtems_test_exit( 1 ); case '\n': break; default: printf( "\n%c is not a valid choice. Try again\n\n", c ); usage(); break; } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -