我绝对喜欢硬件UART,而不是像Pigpio那样的软件实现。
您可以将奇偶校验位用于9位通信。有一个小问题:当前内核不支持CMSPAR(空格/标记奇偶校验)。
但是即使使用当前内核,您也可以切换奇偶校验以获得所需的第9位值,例如:
unsigned char check_parity(unsigned char v)
{
v ^= v >> 4;
v &= 0xf;
return (0x6996 >> ((v ^ (v >> 4)) & 0xf)) & 1;
}
/* send 9 bits - 8 bits of byte + 1 bit of parity */
send_byte_with_parity(unsigned char byte, unsigned char parity)
{
if (check_parity(byte) == parity) {
options.c_cflag &= ~PARODD;
} else {
options.c_cflag |= PARODD;
}
tcsetattr(fd, 0, &options);
write(fd, &byte, 1);
}
更好的方法IMHO是使用小的内核补丁来支持CMSPAR:
http
://marc.info/?l=linux-serial&m=145706834101241&w=2
它添加了标记/空格奇偶校验支持,从而使代码更简单。
PS I使用这种方法通过串行实现了MDB。它可以完美地在Pi上运行。
PPS补丁已获得批准,并且CMSPAR将以4.6内核开始即用。