linux C串口数据解析

@解析串口数据

串口初始化及配置

下面展示一些 串口相关初始化
/相关初始化/

pthread_t pSerial;
static const char *device = "/dev/ttyS1";
static int uartFd = 0;
int speed_arr[] = {
    B921600, B460800, B230400, B115200, B57600, B38400, B19200,
    B9600, B4800, B2400, B1200, B300,
};
int name_arr[] = {
    921600, 460800, 230400, 115200, 57600, 38400,  19200,
    9600,  4800,  2400,  1200,  300,
};

/设置串口速度/

void set_speed(int fd, int speed)
{
    int   i;
    int   status;
    struct termios   Opt;
    tcgetattr(fd, &Opt);

    for ( i= 0;  i < (int)(sizeof(speed_arr) / sizeof(int));  i++) {
        if  (speed == name_arr[i])	{
            tcflush(fd, TCIOFLUSH);
            cfsetispeed(&Opt, speed_arr[i]);
            cfsetospeed(&Opt, speed_arr[i]);
            status = tcsetattr(fd, TCSANOW, &Opt);
            if  (status != 0)
                perror("tcsetattr fd1");
            return;
        }
        tcflush(fd,TCIOFLUSH);
    }

    if (i == 12){
        printf("\tSorry, please set the correct baud rate!\n\n");
    }
}

/串口相关设置,停止位,校验位…/

int set_Parity(int fd,int databits,int stopbits,int parity)
{
    struct termios options;
    if  ( tcgetattr( fd,&options)  !=  0) {
        perror("SetupSerial 1");
        return(FALSE);
    }
    options.c_cflag &= ~CSIZE ;
    switch (databits) /*脡猫脰脙脢媒戮脻脦禄脢媒*/ {
    case 7:
        options.c_cflag |= CS7;
        break;
    case 8:
        options.c_cflag |= CS8;
        break;
    default:
        fprintf(stderr,"Unsupported data size\n");
        return (FALSE);
    }

    switch (parity) {
    case 'n':
    case 'N':
        options.c_cflag &= ~PARENB;   /* Clear parity enable */
        options.c_iflag &= ~INPCK;     /* Enable parity checking */
        break;
    case 'o':
    case 'O':
        options.c_cflag |= (PARODD | PARENB);  /* 脡猫脰脙脦陋脝忙脨搂脩茅*/
        options.c_iflag |= INPCK;             /* Disnable parity checking */
        break;
    case 'e':
    case 'E':
        options.c_cflag |= PARENB;     /* Enable parity */
        options.c_cflag &= ~PARODD;   /* 脳陋禄禄脦陋脜录脨搂脩茅*/
        options.c_iflag |= INPCK;       /* Disnable parity checking */
        break;
    case 'S':
    case 's':  /*as no parity*/
        options.c_cflag &= ~PARENB;
        options.c_cflag &= ~CSTOPB;
        break;
    default:
        fprintf(stderr,"Unsupported parity\n");
        return (FALSE);
    }
    /* 脡猫脰脙脥拢脰鹿脦禄*/
    switch (stopbits) {
    case 1:
        options.c_cflag &= ~CSTOPB;
        break;
    case 2:
        options.c_cflag |= CSTOPB;
        break;
    default:
        fprintf(stderr,"Unsupported stop bits\n");
        return (FALSE);
    }
    /* Set input parity option */
    if (parity != 'n')
        options.c_iflag |= INPCK;
    options.c_cc[VTIME] = 1; // 15 seconds
    options.c_cc[VMIN] = 128;
    options.c_lflag &= ~(ECHO | ICANON);
    options.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
    options.c_oflag &= ~OPOST;
    options.c_cflag |= CLOCAL | CREAD;
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

    tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
    if (tcsetattr(fd,TCSANOW,&options) != 0) {
        perror("SetupSerial 3");
        return (FALSE);
    }
    return (TRUE);
}

/打开串口/linux下查看串口 /dev/ttyS*

int OpenDev(const char *Dev)
{
    int fd = open( Dev, O_RDWR | O_NOCTTY | O_NDELAY);
    if (-1 == fd)
    {
        perror("Can't Open Serial Port");
        return -1;
    } else
        return fd;
}
*这里就是初始化串口一些信息调用以上的函数* __
void InitCom(const char *SeriName)
{
    //    pthread_t pSerial;
    uartFd = OpenDev(SeriName);
    if (uartFd > 0)
    {
        set_speed(uartFd, 19200);
        if (set_Parity(uartFd,8,1,'N')== FALSE)
        {
            fprintf(stderr, "Set Parity Error\n");
            close(uartFd);
            return;
        }
        pthread_create(&pSerial,NULL,ReadComData,NULL);
    }
    else
    {        printf("Open %s Falied!\r\n",device);
        return;
    }
}

串口数据的解析

*启动线程接收* __
void InitCom(const char *SeriName)
{
    //    pthread_t pSerial;
    uartFd = OpenDev(SeriName);
    if (uartFd > 0)
    {
        set_speed(uartFd, 19200);
        if (set_Parity(uartFd,8,1,'N')== FALSE)
        {
            fprintf(stderr, "Set Parity Error\n");
            close(uartFd);
            return;
        }
        pthread_create(&pSerial,NULL,ReadComData,NULL);/*线程函数在下面*/
    }
    else
    {        printf("Open %s Falied!\r\n",device);
        return;
    }
}

下面展示一些 接收串口数据解析

void * ReadComData(void *arg)
{
    printf("%s is running\r\n",__FUNCTION__);
    (void)arg;
    char buf[128];
    int rtn;
    int index = 0;
    char c;
    while(1)
    {
        rtn = read(uartFd,&c,1);
        if(rtn > 0)
        {
        /*接收到的数据开头为A*/
            if('A' == c)
            {
                index = 1;
                buf[0] = c;
            }
            /*以换行结束,也就是在输入如:A123456\r,\r是在串口界面上输入发送信息的时候键盘上的回车*/
            else if('\r' == c)
            {
                buf[index] = '\0';
                if('>' == buf[0])
                {
                    printf("Recv data is:%s\r\n",buf);
                    /**/
                }
                index = 0;
            }
            /*没找到继续找*/
            else
            {
                buf[index] = c;
                index++;
                if(index >= 128)
                    index = 0;
            }
        }
    }
    return NULL;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值