所以我有一个开发板,它有一些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
也捕获数据。)