<div><br></div><div>here is my code:</div><div><br></div><div><div><span style="font-size: 14px;">#define CONFIGURE_INIT</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">#include <stdio.h></span></div><div><span style="font-size: 14px;">#include <stdlib.h></span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">#include <string.h>  /* String function definitions */</span></div><div><span style="font-size: 14px;">#include <unistd.h>  /* UNIX standard function definitions */</span></div><div><span style="font-size: 14px;">#include <fcntl.h>   /* File control definitions */</span></div><div><span style="font-size: 14px;">#include <errno.h>   /* Error number definitions */</span></div><div><span style="font-size: 14px;">#include <termios.h> /* POSIX terminal control definitions */</span></div><div><span style="font-size: 14px;">#include <sys/select.h></span></div><div><span style="font-size: 14px;">#include <rtems.h></span></div><div><span style="font-size: 14px;">#include <rtems/shell.h></span></div><div><span style="font-size: 14px;">#include <bsp.h></span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">extern rtems_task Init(rtems_task_argument argument);</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">//#define CONFIGURE_APPLICATION_EXTRA_DRIVERS  TTY1_DRIVER_TABLE_ENTRY</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER</span></div><div><span style="font-size: 14px;">#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER</span></div><div><span style="font-size: 14px;">#ifdef RTEMS_BSP_HAS_IDE_DRIVER</span></div><div><span style="font-size: 14px;">#define CONFIGURE_APPLICATION_NEEDS_IDE_DRIVER</span></div><div><span style="font-size: 14px;">#endif</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">//#define CONFIGURE_APPLICATION_NEEDS_LIBBLOCK</span></div><div><span style="font-size: 14px;">//#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">/*</span></div><div><span style="font-size: 14px;"> * these values are higher than needed...</span></div><div><span style="font-size: 14px;"> */</span></div><div><span style="font-size: 14px;">#define CONFIGURE_MAXIMUM_TASKS             3</span></div><div><span style="font-size: 14px;">//#define CONFIGURE_MAXIMUM_SEMAPHORES        20</span></div><div><span style="font-size: 14px;">//#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES    20</span></div><div><span style="font-size: 14px;">#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 10</span></div><div><span style="font-size: 14px;">//#define STACK_CHECKER_ON</span></div><div><span style="font-size: 14px;">#define CONFIGURE_RTEMS_INIT_TASKS_TABLE</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">//#define CONFIGURE_EXTRA_TASK_STACKS         (6 * RTEMS_MINIMUM_STACK_SIZE)</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">#define CONFIGURE_INIT</span></div><div><span style="font-size: 14px;">#include <rtems/confdefs.h></span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">//#define CONFIGURE_SHELL_COMMANDS_INIT</span></div><div><span style="font-size: 14px;">//#define CONFIGURE_SHELL_COMMANDS_ALL</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">//#include <rtems/shellconfig.h></span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">void testCom1(void);</span></div><div><span style="font-size: 14px;">int uart_recv(int fd, char *rcv_buf,int data_len);</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">void fillBufferPoll(int fd, char *buf, int len)</span></div><div><span style="font-size: 14px;">{</span></div><div><span style="font-size: 14px;">    int n;</span></div><div><span style="font-size: 14px;">    char ch;</span></div><div><span style="font-size: 14px;">    int i = 0;</span></div><div><span style="font-size: 14px;">    printf("in poll function.\n");</span></div><div><span style="font-size: 14px;">    for(;;)</span></div><div><span style="font-size: 14px;">    {</span></div><div><span style="font-size: 14px;">        n = read(fd, &ch, 1);  // non blocked read</span></div><div><span style="font-size: 14px;">        printf("n %d cc %x\n", n, ch);</span></div><div><span style="font-size: 14px;">        if (n <= 0)</span></div><div><span style="font-size: 14px;">        {</span></div><div><span style="font-size: 14px;">            rtems_task_wake_after (0.1);  // delay 10ms</span></div><div><span style="font-size: 14px;">        }</span></div><div><span style="font-size: 14px;">        else if(n == 1)</span></div><div><span style="font-size: 14px;">        {</span></div><div><span style="font-size: 14px;">            if(ch == '\r')</span></div><div><span style="font-size: 14px;">                continue;</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">            if(ch == '\n')</span></div><div><span style="font-size: 14px;">            {</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">                printf("uart %s\n", buf);</span></div><div><span style="font-size: 14px;">                break;</span></div><div><span style="font-size: 14px;">            }</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">            buf[i] = ch;</span></div><div><span style="font-size: 14px;">            printf("the %d th char %c \n", i, buf[i]);</span></div><div><span style="font-size: 14px;">            i++;</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">            if(i == len)</span></div><div><span style="font-size: 14px;">                break;</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">            </span></div><div><span style="font-size: 14px;">        }</span></div><div><span style="font-size: 14px;">    }</span></div><div><span style="font-size: 14px;">}</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">void testCom1(void) {</span></div><div><span style="font-size: 14px;">  char buffer[128] = {0};</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  printf("*** Simple COM1 Test ***\n");</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  //int fd = open("/dev/ttyS2", O_RDWR | O_NOCTTY | _FNDELAY);</span></div><div><span style="font-size: 14px;">  int fd = open("/dev/ttyS2", O_RDWR | O_NOCTTY | O_NONBLOCK);</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  printf("\nOpened COM1, fd=%d\n\n", fd);</span></div><div><span style="font-size: 14px;">  if(fd < 0)</span></div><div><span style="font-size: 14px;">      printf("open error\n");</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  #if 0</span></div><div><span style="font-size: 14px;">  if(fcntl(fd, F_SETFL, 0) < 0)  </span></div><div><span style="font-size: 14px;">  {  </span></div><div><span style="font-size: 14px;">    printf("fcntl failed!\n");  </span></div><div><span style="font-size: 14px;">    return;  </span></div><div><span style="font-size: 14px;">  }       </span></div><div><span style="font-size: 14px;">  else  </span></div><div><span style="font-size: 14px;">  {  </span></div><div><span style="font-size: 14px;">      printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));  </span></div><div><span style="font-size: 14px;">  }</span></div><div><span style="font-size: 14px;">  #endif</span></div><div><span style="font-size: 14px;">  //fcntl(fd, F_SETFL, 0); // set blocked</span></div><div><span style="font-size: 14px;">  </span></div><div><span style="font-size: 14px;">  struct termios options;</span></div><div><span style="font-size: 14px;">  tcgetattr(fd, &options);</span></div><div><span style="font-size: 14px;">  bzero(&options, sizeof(options));</span></div><div><span style="font-size: 14px;"><span style="white-space:pre">        </span>/* setting the baud rate */</span></div><div><span style="font-size: 14px;">  cfsetispeed(&options, B115200);</span></div><div><span style="font-size: 14px;">  cfsetospeed(&options, B115200);</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="white-space: pre; font-size: 14px;">    </span></div><div><span style="font-size: 14px;">  options.c_cflag |= (CLOCAL | CREAD);</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  options.c_cflag &= ~PARENB;</span></div><div><span style="font-size: 14px;">  options.c_cflag &= ~CSTOPB;</span></div><div><span style="font-size: 14px;">  options.c_cflag &= ~CSIZE;</span></div><div><span style="font-size: 14px;">  options.c_cflag |= CS8;</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  options.c_iflag = IGNPAR| ICRNL;</span></div><div><span style="font-size: 14px;">  options.c_oflag = 0;</span></div><div><span style="font-size: 14px;">  options.c_lflag = ICANON;</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  options.c_cc[VEOF] = 4;</span></div><div><span style="font-size: 14px;">  options.c_cc[VMIN] = 1;</span></div><div><span style="font-size: 14px;">  options.c_cc[VTIME] = 0;</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  //tcflush(fd, TCIFLUSH);</span></div><div><span style="font-size: 14px;">  tcsetattr(fd, TCSANOW, &options);  </span></div><div><span style="font-size: 14px;">      </span></div><div><span style="font-size: 14px;">  if(0 == isatty(fd))  </span></div><div><span style="font-size: 14px;">  {  </span></div><div><span style="font-size: 14px;">      printf("input is not a terminal device\n");  </span></div><div><span style="font-size: 14px;">      //return;  </span></div><div><span style="font-size: 14px;">  }</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  int numBytes = write(fd, "Hello, I'm waiting for input..\r\n", 33);</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  if (numBytes < 0) {</span></div><div><span style="font-size: 14px;">    printf("\nFailed to send from COM1!\n");</span></div><div><span style="font-size: 14px;">  }</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  </span></div><div><span style="font-size: 14px;">  //wait input </span></div><div><span style="font-size: 14px;">  //printf("wait  \n");</span></div><div><span style="font-size: 14px;">  fillBufferPoll(fd, buffer, 100);</span></div><div><span style="font-size: 14px;">  #if 0</span></div><div><span style="font-size: 14px;">  //(void) rtems_task_wake_after( 5 * rtems_clock_get_ticks_per_second() );</span></div><div><span style="font-size: 14px;">  numBytes = read(fd, buffer, 20);</span></div><div><span style="font-size: 14px;">  printf("read bytes %d\n", numBytes);</span></div><div><span style="font-size: 14px;">  strerror(errno);</span></div><div><span style="font-size: 14px;">  if (numBytes < 0) {</span></div><div><span style="font-size: 14px;">    printf("\nFailed to read from COM1!\n");</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  }</span></div><div><span style="font-size: 14px;">  else if(numBytes == 0)</span></div><div><span style="font-size: 14px;">  {</span></div><div><span style="font-size: 14px;">    printf("read error return 0\n");</span></div><div><span style="font-size: 14px;">  }</span></div><div><span style="font-size: 14px;">  else</span></div><div><span style="font-size: 14px;">  {</span></div><div><span style="font-size: 14px;">    //buffer[numBytes] = 0; // terminate</span></div><div><span style="font-size: 14px;">    printf("rev: %s\n", buffer);</span></div><div><span style="font-size: 14px;">  }</span></div><div><span style="font-size: 14px;">  #endif</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  //int read_cnt = uart_recv(fd, buffer, 20);</span></div><div><span style="font-size: 14px;">  //printf("rev: %s\n", buffer);</span></div><div><span style="font-size: 14px;">  //printf("read_cnt: %d\n", read_cnt);</span></div><div><span style="font-size: 14px;">  close(fd);</span></div><div><span style="font-size: 14px;">  //rtems_task_delete(RTEMS_SELF);</span></div><div><span style="font-size: 14px;">}</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">rtems_task Init(rtems_task_argument ignored) {</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  testCom1();</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  printf("\n====== starting shell ======\n");</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">  (void) rtems_task_delete( RTEMS_SELF );</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">#if 0</span></div><div><span style="font-size: 14px;">  rtems_shell_init(</span></div><div><span style="font-size: 14px;">    "SHLL",                          /* task_name */</span></div><div><span style="font-size: 14px;">    RTEMS_MINIMUM_STACK_SIZE * 4,    /* task_stacksize */</span></div><div><span style="font-size: 14px;">    100,                             /* task_priority */</span></div><div><span style="font-size: 14px;">    "/dev/console",                  /* devname */</span></div><div><span style="font-size: 14px;">    0,                               /* forever */</span></div><div><span style="font-size: 14px;">    1                                /* wait */</span></div><div><span style="font-size: 14px;">  );</span></div><div><span style="font-size: 14px;">#endif</span></div><div><span style="font-size: 14px;">  exit( 0 );</span></div><div><span style="font-size: 14px;">}</span></div></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;"><br></span></div><div>// com log</div><div><br></div><div><br></div><div><div><span style="font-size: 14px;">[16:53:49.578]RX¡û¡ô*** Simple COM1 Test ***</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">Opened COM1, fd=3</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">Hello, I'm waiting for input..</span></div><div><span style="font-size: 14px;">\0in poll function.</span></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">[16:53:52.283]TX¡ú¡óhelp</span></div><div><span style="font-size: 14px;">¡õ</span></div></div><div><span style="font-size: 14px;"><br></span></div><div><span style="font-size: 14px;">I'm sure the read is blocked, why?  stm32 uart does not use termios driver, right?</span></div>