简体   繁体   English

调用两次时,write()到串口失败

[英]write() to serial port fails when called twice

I'm trying to write a char array to the serial port twice. 我正在尝试将一个char数组写入串口两次。 For some reason the second time I call write() it fails and I have no idea why. 由于某种原因我第二次调用write()它失败了,我不明白为什么。 The weird part is that the first write succeeds. 奇怪的是第一次写入成功。

Here's my write function: 这是我的写功能:

void write_port()
{
  unsigned char writeBuffer[5];
  int i;
  size_t len;

  writeBuffer[0] = 0x00;
  writeBuffer[1] = 0x01;
  writeBuffer[2] = 0x02;
  writeBuffer[3] = 0x03;
  writeBuffer[4] = 0x04;  

  len = sizeof(writeBuffer);

  for (i=0; i < len; i++)
  {
    printf("Write: %x\n", writeBuffer[i]);
  }

  //First Write:
  int n = write(fd, writeBuffer, len);
  if (n < 0)
    fputs("Serial Port Write Failed!\n", stderr);
  else
    printf("Wrote %0d bytes to serial port\n", n);

  //Second Write:
  n = write(fd, writeBuffer, len);
  if (n < 0)
    fputs("Serial Port Write Failed!\n", stderr);
  else
    printf("Wrote %0d bytes to serial port\n", n);  
}

Here's where I configure the port: 这是我配置端口的地方:

int open_port(void)
{
  struct termios options;

  fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);

  bzero(&options, sizeof(options));   // set everything to 0 

  if (fd != -1)
  {
    printf("Serial Port Open\n");

    tcgetattr(fd, &options_original);
    tcgetattr(fd, &options);
    cfsetispeed(&options, B460800);
    cfsetospeed(&options, B460800);
    options.c_cflag |= (CLOCAL | CREAD); /* Enable the receiver and set local mode */
    options.c_cflag &= ~ECHO; // Disable echoing of input characters
    options.c_cflag &= ~ECHOE;
    options.c_cflag &= ~PARENB; // parity disabled
    options.c_cflag &= ~CSTOPB; // 1 stop bit
    options.c_cflag &= ~CSIZE;  // Mask the character size bits
    options.c_cflag |=  CS8;    // 8 data bits    
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);  /* Raw Input Mode */

    if (tcsetattr(fd, TCSANOW, &options))    /* Set the new options for the port */
    {
      perror("could not set the serial settings!");
      return -1;
    }
  }
  else
  {
    /* Could not open the port */
    perror("open_port: Unable to open /dev/ttyUSB0 - ");
  }

  return (fd);
}

Finally here's my console output. 最后这是我的控制台输出。

Serial Port Open
Flushing IO Buffers
Write: 0
Write: 1
Write: 2
Write: 3
Write: 4
Wrote 5 bytes to serial port
Serial Port Write Failed!
Serial Port Closed

So for some unknown reason I get -1 back from the second write() and have absolutely no idea why, what in the world could cause that? 因此,由于一些未知的原因,我从第二次写()得到-1,并且完全不知道为什么,世界上有什么可能导致这种情况?

I think that your send buffer is getting full and you are using a non-blocking socket which means that instead of waiting for the buffer to clear like in a blocking socket, the process just returns the "Resource temporarily unavailable error". 我认为您的发送缓冲区已满,并且您正在使用非阻塞套接字,这意味着该进程只返回“资源暂时不可用错误”,而不是像阻塞套接字一样等待缓冲区清除。 See this thread for more info: What can cause a “Resource temporarily unavailable” on sock send() command 有关更多信息,请参阅此主题: 什么可能导致sock send()命令中的“资源暂时不可用”

The write system call if fails set errno variable. 写入系统调用如果失败则设置errno变量。 You can check that to get exact details of why write failed. 您可以检查以获取写入失败原因的确切详细信息。 Additionally you may refer this project's native code for linux to see how write is implemented https://github.com/RishiGupta12/serial-communication-manager 另外,你可以参考这个项目的linux本机代码,看看如何实现写入https://github.com/RishiGupta12/serial-communication-manager

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM