与标记和空间奇偶校验的串行通信

在通过@wallyk回答如何打开,读取和写入从C串行端口 ,我写了一个程序,通过我的USB端口发送数据。 我需要发送一个6字节的数据,其中第一个字节应该是标记奇偶校验,其余的应该是空间奇偶校验。 这就是我已经声明了2个variablesmsg1和msg2的原因

#include<stdio.h> #include <errno.h> #include <termios.h> #include <unistd.h> #include<fcntl.h>// used for opening ttys0 #include<sys/ioctl.h> #include<sched.h> #include<string.h> // for memset #include<time.h> int set_interface_attribs (int fd, int speed, int parity) { struct termios tty; memset (&tty, 0, sizeof tty); // initialize all in struct tty with 0 if (tcgetattr (fd, &tty) != 0)// gets parameters from fd and stores them in tty struct { perror("error from tcgetattr"); return -1; } cfsetospeed (&tty, speed); cfsetispeed (&tty, speed); tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars, CSIZE -> character size mask // disable IGNBRK for mismatched speed tests; otherwise receive break // as \000 chars tty.c_iflag &= ~IGNBRK; // ignore break signal tty.c_lflag = 0; // no signaling chars, no echo, // no canonical processing tty.c_oflag = 0; // no remapping, no delays tty.c_cflag &= ~(PARENB | PARODD); // shut off parity tty.c_cflag |= parity; tty.c_cflag &= ~CSTOPB;// 1 stop bit tty.c_cflag &= ~CRTSCTS; if (tcsetattr (fd, TCSANOW, &tty) != 0) // TCSANOW -> the change takes place immediately { perror("error from tcsetattr"); return -1; } return 0; } int main() { char *portname = "/dev/ttyUSB0"; int fd = open (portname, O_RDWR | O_NOCTTY | O_SYNC); if (fd < 0) { perror("error opening"); return; } char msg1[1]={0x01}; char msg2[5]={0x02,0x08,0x00,0xff,0xf5}; set_interface_attribs (fd, B115200,PARENB|PARODD|CMSPAR); // set speed to 115200, bps,mark parity // set no blocking write (fd, msg1, sizeof msg1); set_interface_attribs (fd, B115200,PARENB|CMSPAR); // set speed to 115200 bps, space parity write (fd,msg2,sizeof msg2); close(fd); return 0; } 

但是现在我发送的所有数据似乎都是空间平价,而不是平价。 即如果我已经configuration了第一个字节发送标记奇偶校验,其余的空间奇偶校验,那么所有的发送空间奇偶校验。 现在,如果我将第一个字节configuration为以空间奇偶校验发送,而其余的为标记奇偶校验,则所有发送均以标记奇偶校验发送。

Solutions Collecting From Web of "与标记和空间奇偶校验的串行通信"