Linux阻止I / O无法按预期工作

时间:2016-06-14 10:16:20

标签: c++ linux blocking beagleboneblack uart

所以我有一个开发板,它有一些UART外设与一些类似*的文件混合。

我已将一些其他设备连接到一个端口(RX引脚),我希望能够读取它发送给我的数据。

设备以11字节的块发送数据。

这是我使用过的代码:

if(-1 == (fd_read = open(port.c_str(), O_RDONLY))) {
            throw std::ios_base::failure("Unable to open UART descriptor.");
    }

    tcgetattr(fd_read, &settings);

    /*!
     * Set some default settings.
     */
    cfsetospeed(&settings, baud);       /* baud rate        */
    settings.c_cflag &= ~PARENB;        /* no parity        */
    settings.c_cflag &= ~CSTOPB;        /* 1 stop bit       */
    settings.c_cflag &= ~CSIZE;
    settings.c_cflag |= CS8 | CLOCAL;   /* 8 bits           */
    settings.c_lflag = ICANON;          /* canonical mode   */
    settings.c_oflag &= ~OPOST;         /* raw output       */

    settings.c_cc[VMIN] = 0;
    settings.c_cc[VTIME] = 0;

    /*!
     * Apply the settings for both: the writing and reading file descriptors.
     */

    tcsetattr(fd_read, TCSANOW, &settings);
    tcflush(fd_read, TCOFLUSH);

问题是其他设备向我发送了一个数据块(我可以在范围内看到它),但read()函数没有返回。

这是读取函数调用:

auto bytesReceived = ::read(fd_read, UARTDataBuffer, max_incoming_uart_data_length); // "max_incoming_uart_data_length" is 2048.

奇怪的是,当我从我的电路板使用另一个TX引脚,并发送完全相同的数据(我想从另一个设备接收)时,一切都按预期工作,read()函数返回用正确的数据。

为什么会这样?

L.E。关于这个问题的更多细节:

开发板(BeagleBone Black)和其他传感器都使用3.3V的UART信号。

使用上面显示的代码配置通信后,我还在关联的tty*文件中应用了以下命令:

stty -F /dev/ttyO2 921600

其中/dev/ttyO2是我的UART关联端口,921600是波特率值。 我使用它是因为termios结构不提供更高的波特值。

我期望stty不会改变其他设置(如奇偶校验,开始/停止位等),它只会设置波特率。

Update2:当我使用minicom打开相同的端口(我期待数据)时,一切都按预期工作,我能够在我的应用程序中接收数据。 (minicom也捕获数据。)

0 个答案:

没有答案