从USB串口读取时可能会失去响应

时间:2018-02-02 00:56:36

标签: c serial-port usb at-command serial-communication

我正在从USB串口(ttyACMx)写入和读取,该串口将调制解调器与处理器连接。我在运行linux的处理器上有一个串行通信过程,它接受用户输入(调制解调器AT命令)并将其写入调制解调器串行端口。要接收响应,我有一个线程,使用select()侦听串行端口文件描述符(fd),然后在fd上执行read()。

当我从端口读取时,我希望对发送到调制解调器的AT命令有完整的响应。大部分时间都适用。偶尔我只得到响应的一部分(例如两个字符 - )我期望我发送的AT命令,没有什么可以读(select()不返回)。

我的问题是,是否有办法确定我的串口接收缓冲区是否有东西需要读取但是需要刷新,因为我假设调制解调器总是向处理器发送完整的响应?

串口端口接收线程和端口配置:

while(1)
{
  numfd = select(max_fd, &read_fd, NULL, NULL, NULL);
  if(numfd > 0)
   {
     if(FD_ISSET(serial_fd, &read_fd))
     {
        ioctl(serial_fd, FIONREAD, &bytes);
        if(bytes)
        {
           num_read = read(serail_fd, buf, buf_len);
           if(num_read <=  0)
           {
              //error
           }
           else
           {
             // construct complete AT command response from buf
           }
        }
     }
   }

   where serial_fd is:

   serial_fd = open("/dev/ttyACM0", O_RDWR|O_EXCL|O_NOCTTY|O_NONBLOCK);

   and it is configured as:

   tcflush(serial_fd, TCIOFLUSH);
   ioctl(serial_fd, TIOCGSERIAL, &serail_info_buf);
   serail_info_buf.closing_wait = ASYNC_CLOSING_WAIT_NONE;
   ioctl (serial_fd, TIOCSSERIAL, &serail_info_buf);

   tcgetattr(serial_fd, &termios_buf);

   termios_buf.c_cflag &= ~(CBAUD | CSIZE | CSTOPB | PARENB | PARODD | CRTSCTS);
   termios_buf.c_iflag &= ~(IGNCR | ICRNL | IUCLC | INPCK | IXON | IXOFF | IXANY);
   termios_buf.c_oflag &= ~(OPOST | OLCUC | OCRNL | ONLCR | ONLRET);
   termios_buf.c_lflag &= ~(ICANON | ECHO | ECHOE | ECHONL);

    termios_buf.c_cc[VMIN] = 2; 
    termios_buf.c_cc[VTIME] = 1; 
    termios_buf.c_cc[VEOF] = 0; 

    termios_buf.c_iflag |= IGNPAR;
    termios_buf.c_cflag |= (CLOCAL | CREAD);

    termios_buf.c_cflag &= ~PARENB;
    termios_buf.c_cflag &= ~CSTOPB;
    termios_buf.c_cflag &= ~CSIZE;
    termios_buf.c_cflag |= CS8;

    cfsetispeed(&termios_buf, B115200); 
    cfsetospeed(&termios_buf, B115200);

    tcsetattr (serial_fd, TCSANOW, &termios_buf)

0 个答案:

没有答案