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

时间:2015-03-25 05:30:14

标签: c serial-port hex

我正在制作一个简单的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。请帮忙,谢谢。!

1 个答案:

答案 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