2

我正在尝试从使用标记奇偶校验作为地址字节和空间奇偶校验作为消息正文的设备接收消息。该设备是多点串行总线的“主机”。根据 termios 手册页,我正在使用 CMSPAR、PARENB、~PARODD、INPCK、~IGNPAR 和 PARMRK。我希望在每个地址字节上获得一个 3 字节序列: '\377' '\0' 。它不会发生......我总是得到地址字节(和正文字节),但没有前导 '\377' '\0' 字符。

我试图让 PARMRK 使用奇偶校验设置,以防不支持 CMSPAR。数据流中仍然没有 3 字节序列。我正在使用 Ubuntu 12.04 LTS。

n_tty.c:n_tty_receive_parity_error() 具有实现 PARMRK 的逻辑。8250_core.c 具有标记奇偶校验错误的逻辑。dmesg | grep ttyS0 显示 serail8250: ... 是 16550A。嗯...随后的消息显示 00:0a: ... 是 16550A。也许 8250 驱动程序实际上并没有处理 ttyS0?

有任何想法吗?即使你没有看到我做错了什么但让 PARMAR 工作,关于你的情况的评论可能对我有帮助。

更新:我的 Linux 在 VMware VM 中运行,所以我尝试了非 VM 配置,现在它可以工作了!如果有人知道,我仍然想知道为什么在 VM 中未检测到奇偶校验错误。

这是我的配置代码:

struct termios tio;
bzero(&tio, sizeof(tio));
tcgetattr(fd, &tio);

// Frame bus runs at 38,400 BAUD
const int BAUD_Rate = B38400;

cfsetispeed(&tio, BAUD_Rate);
cfsetospeed(&tio, BAUD_Rate);

// Initialize to raw mode. PARMRK and PARENB will be over-ridden before calling tcsetattr()
cfmakeraw(&tio);

// Ignore modem lines and enable receiver
tio.c_cflag |= (CLOCAL | CREAD);

// No flow control
tio.c_cflag &= ~CRTSCTS;        // No HW flow control
tio.c_iflag &= ~(IXON | IXOFF); // Set the input flags to disable in-band flow control

// Set bits per byte
tio.c_cflag &= ~CSIZE;
tio.c_cflag |=  CS8;

// Use space parity to get 3-byte sequence (0xff 0x00 <address>) on address byte
tio.c_cflag |=  CMSPAR;         // Set "stick" parity (either mark or space)
tio.c_cflag &= ~PARODD;         // Select space parity so that only address byte causes error

// NOTE: The following block overrides PARMRK and PARENB bits cleared by cfmakeraw.
tio.c_cflag |=  PARENB;         // Enable parity generation
tio.c_iflag |=  INPCK;          // Enable parity checking
tio.c_iflag |=  PARMRK;         // Enable in-band marking 
tio.c_iflag &= ~IGNPAR;         // Make sure input parity errors are not ignored

// Set it up now
if (tcsetattr(fd, TCSANOW, &tio) == -1)
{
    cout << "Failed to setup the port: " << errno << endl;
    return -1;
}
4

1 回答 1

0

我遇到了类似的问题(但从相反的角度):

串行协议的主机应该发送带有奇偶校验标志的帧的第一个字节,其余的都带有奇偶校验空间,而从机只响应奇偶校验空间。

许多串行通信驱动程序将忽略“CMSPAR”位而不返回错误,因此您可能认为您已经设置了奇偶校验标记/空格,而实际上您已经选择了奇偶校验奇偶校验。

我不得不使用协议分析器来实现这一点。

所以我最终在发送之前检查每个字节的数据并在奇偶校验之间切换,以模拟我需要的标记/空间奇偶校验。

大多数 USB 到串行适配器将需要类似的方法,因为它们不支持奇偶校验标记/空间。

例如,假设我们要发送以下数据:

01 03 07 0F 1F

第一个字节应与奇偶校验标记一起发送,其余字节与奇偶校验空间一起发送

我们可以做到以下几点:

Send 01 with odd  parity (parity bit=1)
Send 03 with odd  parity (parity bit=0)
Send 07 with even parity (parity bit=0)
Send 0F with odd  parity (parity bit=0)
Send 1F with even parity (parity bit=0)

这样我们就可以模拟所需的结果。

这里的问题是,当您切换奇偶校验时,驱动程序会执行大量耗时的检查,这会影响数据传输的最终速率。

我在嵌入式设备上使用了破解版的串行通信驱动程序,它可以通过省略一些对应用程序不必要的检查(例如波特率更改)来非常快速地切换奇偶校验。

如果您的字符间延迟很关键,您可能需要不同的解决方案。

于 2015-06-08T12:22:34.210 回答