您尚未登录。

楼主 #1 2018-02-07 22:53:55

zhen8838
会员
注册时间: 2018-01-19
已发帖子: 32
积分: 32

v3s串口接收,只能一次接收32个字节,这是什么问题?

我想用v3s解析gps数据。本来想得是可以读取到换行符停止。但是目前的现象是一串数据过来,比如45个字节,我串口接收到就变成长度32和13的两个数据。
例如我发送$GPGSA,A,1,,,,,,,,,,,,,99.99,99.99,99.99*30
接受到的信息如下

# ./uartRec
fcntl=0
isatty success!
fd->open=3
Receive 32
Receice 11

我的串口接收线程如下

static void *threadRead(void *arg)//串口读取线程
{
    while(1)
    {

        bufflen=UART_Recv(uartfd,RecvBuff,150);
        if(bufflen>0)
        {
            SendBuff=(char *)malloc(bufflen);
            memcpy(SendBuff,RecvBuff,bufflen);
            printf("Receive %d\n",bufflen);
            free(SendBuff);
        }
        usleep(1000);
    }
    return NULL;
}

串口接受程序如下

int UART_Recv(int fd, char *rcv_buf,int data_len)
{
    int len,fs_sel;
    fd_set fs_read;

    struct timeval time;

    FD_ZERO(&fs_read);
    FD_SET(fd,&fs_read);

    time.tv_sec = 10;//等待时间 秒
    time.tv_usec = 0;//等待时间 微妙

    //使用select实现串口的多路通信
    fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);
    //printf("fs_sel = %d\n",fs_sel);
    if(fs_sel)
    {
        len = read(fd,rcv_buf,data_len);
        //printf("len = %d fs_sel = %d\n",len,fs_sel);
        return len;
    }
    else
    {
        //printf("Sorry,I am wrong!");
        return FALSE;
    }
}

请大家给些指点,或者给个思路怎样在一次只接收32字节的情况下解析gps。。。

离线

楼主 #4 2018-02-08 10:41:43

zhen8838
会员
注册时间: 2018-01-19
已发帖子: 32
积分: 32

Re: v3s串口接收,只能一次接收32个字节,这是什么问题?

晕哥 说:

你用一个环形缓冲区实现,一个生产者,一个消费者,
消费者只分析缓冲区就可以。

ok!谢谢指点!

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn