在串行通信中获取错误数据

我正在制作一个简单的C程序,以便从串行设备串行获取数据。 数据采用hex格式。 在编写代码之前,我在cutecom中检查了它,我收到了25 54 00 1e ,这是正确和准确的值。 但是当我编写代码然后我收到这个错误数据的BFE50A14 。 我不知道我在哪里弄错了,请帮忙。 谢谢。!

码:

 #include  #include  #include  #include  #include  #include  #include  #include  #define portname "/dev/ttyUSB0" int set_interface_attribs (int fd, int speed, int parity) { struct termios tty; memset (&tty, 0, sizeof tty); if (tcgetattr (fd, &tty) != 0) { // error_message ("error %d from tcgetattr", errno); printf("error opening the device"); return -1; } cfsetospeed (&tty, speed); cfsetispeed (&tty, speed); tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars // disable IGNBRK for mismatched speed tests; otherwise receive break // as \000 chars tty.c_iflag &= ~IGNBRK; // disable break processing tty.c_lflag = 0; // no signaling chars, no echo, // no canonical processing tty.c_oflag = 0; // no remapping, no delays tty.c_cc[VMIN] = 0; // read doesn't block tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls, // enable reading tty.c_cflag &= ~(PARENB | PARODD); // shut off parity tty.c_cflag |= parity; tty.c_cflag &= ~CSTOPB; tty.c_cflag &= ~CRTSCTS; if (tcsetattr (fd, TCSANOW, &tty) != 0) { // error_message ("error %d from tcsetattr", errno); printf("error opening the device"); return -1; } return 0; } int set_blocking (int fd, int should_block) { struct termios tty; memset (&tty, 0, sizeof tty); if (tcgetattr (fd, &tty) != 0) { //error_message ("error %d from tggetattr", errno); printf("error opening the device"); return; } tty.c_cc[VMIN] = should_block ? 1 : 0; tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout if (tcsetattr (fd, TCSANOW, &tty) != 0) // error_message ("error %d setting term attributes", errno); printf("error opening the device"); } int main() { int fd = open (portname, O_RDWR | O_NOCTTY | O_SYNC); if (fd < 0) { printf("error opening the device"); } /*CHANGES*/ if(!set_interface_attribs(fd, B9600, 0)) { printf("error set interface"); } else printf("correct"); if(!set_blocking(fd, 0)) { printf("error set blocking"); } else printf("done"); */ set_interface_attribs (fd, B9600, 0); set_blocking (fd, 0); // set no blocking usleep ((7 + 25) * 100); int receivebuffer [10]; read (fd, receivebuffer, sizeof receivebuffer); /***CHANGES***// printf("value of buffer is %2X %2X %2X %2X \n\n", receivebuffer[0],receivebuffer[1],receivebuffer[2],receivebuffer[3]); return 0; } 

我在receivebuffer中接收数据,我使用printf打印它并使用%X以hex格式打印它。 我得到的输出是BFE50A14但正确的输出是25 54 00 1e 。 请帮忙,谢谢!

这是我们迄今为止在评论中所涵盖的内容:

 Note: this only vaguely resembles the code most recently posted Note: do not use tabs in your code. because different editors have the tab stops and/or tab width set differently #include  #include  #include  #include  #include  #include  #include  #include  #define portname "/dev/ttyUSB0" static struct termios oldtty; int set_interface_attribs (int fd, int speed, int parity) { struct termios tty; memset (&tty, 0, sizeof tty); if (tcgetattr (fd, &oldtty) != 0) { // error_message ("error %d from tcgetattr", errno); printf("error opening the device"); return -1; } memcpy( tty, oldtty, sizeof struct termion ); cfsetospeed (&tty, speed); cfsetispeed (&tty, speed); tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars // disable IGNBRK for mismatched speed tests; otherwise receive break // as \000 chars tty.c_iflag &= ~IGNBRK; // disable break processing tty.c_lflag = 0; // no signaling chars, no echo, // no canonical processing tty.c_oflag = 0; // no remapping, no delays tty.c_cc[VMIN] = 0; // read doesn't block tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls, // enable reading tty.c_cflag &= ~(PARENB | PARODD); // shut off parity tty.c_cflag |= parity; tty.c_cflag &= ~CSTOPB; tty.c_cflag &= ~CRTSCTS; if (tcsetattr (fd, TCSANOW, &tty) != 0) { // error_message ("error %d from tcsetattr", errno); printf("error opening the device"); return -1; } return 0; } // end function: set_interface_attribs int set_blocking (int fd, int should_block) { struct termios tty; memset (&tty, 0, sizeof tty); if (tcgetattr (fd, &tty) != 0) { //error_message ("error %d from tggetattr", errno); printf("error opening the device"); return -1; } tty.c_cc[VMIN] = should_block ? 1 : 0; tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout if (tcsetattr (fd, TCSANOW, &tty) != 0) // error_message ("error %d setting term attributes", errno); printf("error opening the device"); return 0; } // end function: set_blocking int main() { int fd = open (portname, O_RDWR | O_NOCTTY | O_SYNC); if (fd < 0) { printf("error opening the device"); } /*CHANGES*/ if(!set_interface_attribs(fd, B9600, 0)) { printf("error set interface"); } else printf("correct"); if(!set_blocking(fd, 0)) { printf("error set blocking"); } else printf("done"); // what is this stray end of comment? // suggest enabling all the compiler warings // and fixing the warnings // */ if( set_interface_attribs (fd, B9600, 0) ) { // then set_interface_attribs failed return -1; } // implied else set_interface_attribs successful if( set_blocking (fd, 0) ) // set no blocking { // then set_blocking failed return -1; // might need to also restore oldtty attributes } // implied else, set_blocking successful usleep ((7 + 25) * 100); char receivebuffer [20]; if( 4 > read (fd, receivebuffer, sizeof receivebuffer) ) { // then read failed return -1; } // implied else, read successful printf("value of buffer is %2X %2X %2X %2X \n\n", receivebuffer[0], receivebuffer[1], receivebuffer[2], receivebuffer[3]); // cleanup tcsetattr (fd, TCSANOW, &oldtty); return 0; } // end function: main