我正在制作一个简单的C程序,以便从串行设备串行获取数据。数据采用十六进制格式。在编写代码之前,我在cutecom中检查了它,然后我就收到了
25 54 00 1e
这是正确且准确的值。但是当我编写代码然后我收到这个BFE50A14
这是错误的数据。我不知道我在哪里弄错了,请帮忙。谢谢!
CODE:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <math.h>
#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
以十六进制格式打印它。我得到的输出是BFE50A14
,但正确的输出是25 54 00 1e
。请帮忙,谢谢。!
答案 0 :(得分:0)
这是我们迄今为止在评论中所涵盖的内容:
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 <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <math.h>
#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