当前位置: 首页 > 面试题库 >

Linux-串行端口读取返回EAGAIN

隗驰
2023-03-14
问题内容

我以下列方式从打开的串行端口读取某些数据时遇到麻烦。我已经多次使用此代码实例,并且一切正常,但是现在,由于某种原因,我无法弄清楚,我完全无法从串行端口读取任何内容。

我能够写,并且在另一端正确接收了所有消息,但是从未收到答复(正确发送)(不,电缆都还好;))

我用来打开串行端口的代码如下:

fd = open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK | O_NOCTTY);
if (fd == -1)
{
    Aviso("Unable to open port");
    return (fd);
}
else
{
    //Get the current options for the port...
    bzero(&options, sizeof(options)); /* clear struct for new port settings */
    tcgetattr(fd, &options);

    /*-- Set baud rate -------------------------------------------------------*/
    if (cfsetispeed(&options, SerialBaudInterp(BaudRate))==-1)
        perror("On cfsetispeed:");
    if (cfsetospeed(&options, SerialBaudInterp(BaudRate))==-1)
        perror("On cfsetospeed:");

    //Enable the receiver and set local mode...
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~PARENB; /* Parity disabled */
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;  /* Mask the character size bits */
    options.c_cflag |= SerialDataBitsInterp(8);           /* CS8 - Selects 8 data bits */
    options.c_cflag &= ~CRTSCTS;                            // disable hardware flow control
    options.c_iflag &= ~(IXON | IXOFF | IXANY);           // disable XON XOFF (for transmit and receive)
    options.c_cflag |= CRTSCTS;                         /* enable hardware flow control */

    options.c_cc[VMIN] = 0;     //min carachters to be read
    options.c_cc[VTIME] = 0;    //Time to wait for data (tenths of seconds)

    //Set the new options for the port...
    tcflush(fd, TCIFLUSH);
    if (tcsetattr(fd, TCSANOW, &options)==-1)
    {
        perror("On tcsetattr:");
    }

    PortOpen[ComPort] = fd;
}

return PortOpen[ComPort];

端口初始化后,我通过简单的write命令向其中写入一些内容。

int nc = write(hCom, txchar, n);

hCom是文件描述符(没关系),并且(如我所说)可以工作。但是…当我随后进行读取时,我从errno收到“资源暂时不可用”错误。

我测试了select以查看何时未读取文件描述符…但是它总是超时!

我这样读取数据:

ret = read(hCom, rxchar, n);

我总是得到一个EAGAIN,我也不知道为什么。

更新:

硬件工作正常!我可以看到串行端口上有入站数据,因为我已经制作了一条调试电缆来读取另一个终端上发生的事情。所以…

我知道非阻塞应该做什么。我的问题是…为什么什么都没有读!相同的设置在Windows上可以正常工作,因此所有硬件都可以正常工作…

这真让我发疯!我敢肯定这很简单!我什至尝试摆脱O_NONBLOCK来看看什么时候可以收到东西…但是什么都没有…


问题答案:

阅读此。

使用O_NONBLOCK选择了EAGAIN非阻塞I / O,并且没有数据可立即读取。



 类似资料:
  • 问题内容: 我研究了许多有用的线程和一些教程,但是仍然存在一些问题,这些问题应该非常简单。作为参考,这里是我细读的一些线程: 无论如何,我有一个问题。如果我收到数据,我的代码可以正常工作。如果不这样做,则read()函数将停顿,退出程序的唯一方法是使用kill -9(注意:我使用信号处理来发信号通知线程读取串行数据以终止。这不是罪魁祸首,即使我删除了信号处理,read()调用仍然停止。我正在尝试做

  • 我试图从一个串行端口读取数据,这个端口连接着Arduino和操纵杆。 当试图打印出接收到的数据以检查我是否得到它时,它会继续打印出与连接时相同的值。 我正在从我的串行端口以这种格式发送数据: Xaxis: yAxis: SwitchBool 这是我在WPF应用程序中的C#代码 这是我的arduino代码: 下面是一个例子,说明在移动拇指时,Arduino的串行监视器中的数据应该是什么样子的: -1

  • 我读了很多问题和答案,但没有找到任何解决方案。也许我的问题不对,但我需要一些指导。我在Linux中使用串行端口,从我的Arduino设备读取数据。每当我想从Arduino向Linux发送数据时,我首先发送两个字节,这表示将从Arduino发送的总字节数。我将这两个字节转换为整数值,并开始从串行端口读取数据。比如说,我想把300字节从Ardiuno发送到Linux,我只需要先写{1,44},然后用下

  • 我做了一个python程序,从串行端口读取gps数据。GPS冰球流NMEA数据语句连续插入USB时。我的程序打开端口,然后尝试读取数据,解析它,然后将其与从Arduino提取的其他数据一起写入文本文件。 我遇到的问题是,当我第一次运行程序时,有时它无法读取数据。我放入了一些Try/Exception捕获,发现以某种方式无法从GPS串行端口读取数据 如果我点击Cntrl-C几次,这似乎可以解决它遇到

  • 问题内容: 我想知道是否有一种方法可以通过PHP读取我的串行端口-可行:-) 在练习Arduino技能时,我开发了一个简单的LED ON / OFF草图。通过在串行监视器中 打开 或 关闭 它可以工作。 下一步,我整理了一个网页,充当GUI界面,以单击链接并执行上面的打开和关闭功能。该基于Web的GUI可通过PHP使用。我正在使用PHP SERIAL 类与Arduino使用的串行端口进行交互。 问

  • 我想知道是否有一种方法可以通过PHP来完成对串行端口的读取——有效:—— 在练习Arduino技能时,我设计了一个简单的LED开关示意图。它通过在串行监视器中输入on或off来工作。 下一步,我把一个网页放在一起,作为一个GUI界面,点击一个链接并执行上面的开关功能。这个基于网络的GUI通过PHP工作。我使用PHP串行类与Arduino使用的串行端口进行交互。 问题是我需要找到一种从串口获取反馈的