UART上的串行数据损坏

时间:2016-05-25 08:39:14

标签: c++ linux serial-port uart termios

我正在开发一个开发板(Beagle Bone Black)的应用程序,它将通过UART外围设备发送一些数据。开发板运行Linux Kernel(一些Debian发行版,3.8.x Linux内核版本。)

要通过UART发送和接收数据,我使用标准UNIX API:open()read()write()家庭功能。

用于设置通信参数(baud ratestop/start bitsparity等...)我使用termios结构(来自termios.h)。

这是我进行I / O设置的一些相关代码序列:

fd_debug = open("output.out", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);

fd_write = open(port.c_str(), O_WRONLY | O_NOCTTY | O_SYNC);
std::cout << std::endl << "I opened: " << port;

struct termios settings;
tcgetattr(fd_write, &settings);

cfsetospeed(&settings, B19200);         /* 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 */

tcsetattr(fd_write, TCSANOW, &settings); /* apply the settings */
tcflush(fd_write, TCOFLUSH);

我在那里打开了两个文件描述符:

  • fd_debug:链接到文件,用于调试目的。
  • fd_write:链接到UART外设(在我的特定情况下为/dev/ttyO4)。

这是当我想通过UART发送一个字节时执行的函数:

int UARTIOHandler::write(uchar8 byte) {
    auto tp = std::chrono::steady_clock::now();
    std::cout << std::endl << "[write] Timestamp: " << std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch()).count();
    ::write(fd_debug, &byte, 1);
    return ::write(this->fd_write, &byte, 1);
}

为了检查我发送的数据是否已通过UART正确接收,我已将TXRX引脚(环回测试)连接到我的主板上(因为我希望能够接收我发送的数据),并在该特定minicom端口上运行UART

minicom -D /dev/ttyO4 -b 19200 -C test.test

发送一些数据后,我比较了两个文件(调试文件和minicom生成的输出文件(应该包含通过UART收到的数据))。问题是数据不一样!

这是实际发送的数据(十六进制):

55 33 02 04 06 08 0a 0c d5 55 0b 01 03 05 07 ef 55 3f 07 06 05 04 03 02 01 e3 55 16 01 02 03 04 05 06 07 08 db 55 3f 01 02 03 04 05 06 07 e3

这是调试文件中收到的数据(它是相同的,所以这证实存在一些UART问题):

55 33 02 04 06 08 0a 0c d5 55 0b 01 03 05 07 ef 55 3f 07 06 05 04 03 02 01 e3 55 16 01 02 03 04 05 06 07 08 db 55 3f 01 02 03 04 05 06 07 e3

这是minicom工具收到的数据(设置为侦听相同的UART端口和相同的设置(baudparity等) ):

55 33 02 04 06 08 0a d5 55 01 03 4d 69 6e 69 63 6f 6d 32 2e 36 2e 31 07 ef 55 3f 07 06 4d 69 6e 69 63 6f 6d 32 2e 36 2e 31 04 03 02 01 e3 55 16 01 02 03 04 4d 69 6e 69 63 6f 6d 32 2e 36 2e 31 06 07 08 db 55 3f 01 02 03 04 4d 69 6e 69 63 6f 6d 32 2e 36 2e 31 06 07 e3

从某一点可以看出,所有数据都已损坏,并且收到了更多字节。

为了检查输出文件中的实际数据,我使用hexdump,如下所示:

hexdump -ve '1/1 "%.2x "' test.test

可能是什么问题?

1 个答案:

答案 0 :(得分:1)

这似乎是Minicom响应ENQ字符(0x05)并在会话捕获中记录其响应。附加数据为Minicom2.6.1,不会损坏。它将替换您的流中的每个0x05。