找回密码
立即注册
搜索
发新帖

150

积分

0

好友

9

主题
发表于 2019-4-29 15:55:34 | 查看: 9227| 回复: 4
尊敬的荣品公司的工程师们,你们好,我在使用贵公司的RD3399B瑞芯微rk3399开发板安装Ubuntu16.04后,发现了一个串口方面的问题,请贵公司帮助解决,问题如下:我在使用rx5tx5组成的ttys5接收每隔4ms发过来的一包10个字节,例如a53 8 ca 3f ff a f 4 b7,发现有数据缓冲现象,正常我每4ms读取的字节数应该为bytes_read = 10,a5 3 8 ca 3f ff a f 4 b7一包数据,但我发现实际上我每4ms读取有时bytes_read = 100,即读了十包100字节或者多包如90120个字节(见下图),我每包10个数据最后一个字节是循环加1的,可以看出字节没有丢失,就是被缓冲了多包一下读出来,这样我系统的实时性大大降低,由原来的4mm周期降低到40ms左右,请问怎么能够实现我要的每4ms读取的字节数应该为bytes_read = 10,a53 8 ca 3f ff a f 4 b7一包数据。
我看贵公司的RD3399B瑞芯微rk3399开发板采用了WK2124SPI接口转四通道通用异步收发器实现SPI4个串口,如下图,
我读了WK2124的手册,发现WK2124有可以设置的256级FIFO收发缓存(如下图加亮部分),我的问题是否是缓存设置的原因,请问贵公司的Ubuntu16.04固件如何设置WK2124的256级FIFO收发缓存?


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

发表于 2019-5-5 16:43:27
串口通信本身就有缓冲区,要提高实时性的话,可以改串口协议,改小缓冲区或者超时发送的时间
如果怀疑是wk2124的串口配置有问题的话,可以测试下系统本身的串口

回复 显示全部楼层 道具 举报

发表于 2019-5-5 16:59:02
可否提供“改串口协议,改小缓冲区或者超时发送的时间”的具体步骤?我们尝试下你的解决方案。

回复 显示全部楼层 道具 举报

发表于 2019-5-5 17:21:53
你是怎么控制串口的,open串口时,加参数就可以设置串口的配置阿
例如:
c_cflag:

CLOCAL 本地模式,不改变端口的所有者
CREAD 表示使能数据接收器
PARENB 表示偶校验
PARODD 表示奇校验
CSTOPB 使用两个停止位
CSIZE 对数据的bit使用掩码
CS8 数据宽度是8bit
c_lflag:

ICANON 使能规范输入,否则使用原始数据(本文使用)
ECHO 回送(echo)输入数据
ECHOE 回送擦除字符
ISIG 使能SIGINTR,SIGSUSP, SIGDSUSP和 SIGQUIT 信号
c_iflag:

IXON 使能输出软件控制
IXOFF 使能输入软件控制
IXANY 允许任何字符再次开启数据流
INLCR 把字符NL(0A)映射到CR(0D)
IGNCR 忽略字符CR(0D)
ICRNL 把CR(0D)映射成字符NR(0A)
c_oflag: OPOST 输出后处理,如果不设置表示原始数据(本文使用原始数据)
c_cc[VMIN]: 最少可读数据
c_cc[VTIME]: 等待数据时间(10秒的倍数)

回复 显示全部楼层 道具 举报

发表于 2019-5-7 15:55:33
我们的串口配置如下,麻烦看看是否有问题?
    fd1 = open("/dev/ttyS5", O_RDWR | O_NOCTTY | O_NONBLOCK );//read and write,load driver of usb to COM
    if (fd1 <0) {perror("/dev/ttyS5"); exit(-1); }
    printf("fd1 = %d\n", fd1);
    saio.sa_handler = signal_handler; // set sa_handle signal_handler() function to capture signal, or means that a signal process function is registered in kernel.
    sigemptyset(&saio.sa_mask);
    //saio.sa_mask = 0;
    saio.sa_flags = 0;
    saio.sa_restorer = NULL;
    sigaction(SIGIO,&saio,NULL);

    fcntl(fd1, F_SETOWN, getpid());
    fcntl(fd1, F_SETFL, FASYNC);

    tcgetattr(fd1, &oldtio);        // Get the current attributes of the Serial port

    cfsetispeed(&newtio,B115200); // Set Read  Speed as 115200
    cfsetospeed(&newtio,B115200); // Set Write Speed as 115200
    newtio.c_cflag &= ~PARENB;   // Disables the Parity Enable bit(PARENB),So No Parity
    newtio.c_cflag &= ~CSTOPB;   // CSTOPB = 2 Stop bits,here it is cleared so 1 Stop bit
    newtio.c_cflag &= ~CSIZE;         // Clears the mask for setting the data size
    newtio.c_cflag |=  CS8;      // Set the data bits = 8
    newtio.c_cflag &= ~CRTSCTS;       // No Hardware flow Control
    newtio.c_cflag |= CREAD | CLOCAL; // Enable receiver,Ignore Modem Control lines
    newtio.c_iflag &= ~(IXON | IXOFF | IXANY); // Disable XON/XOFF flow control both i/p and o/p
    newtio.c_iflag &= ~(ICANON | ECHO | ECHOE | ISIG);  // Non Cannonical mode
    newtio.c_lflag=0;
    newtio.c_oflag=0;

    newtio.c_cc[VTIME]=0;//
    newtio.c_cc[VMIN]=10;//

    if((tcsetattr(fd1,TCSANOW,&newtio)) != 0)
    {
        printf("\n  ERROR ! in Setting attributes");
    }
    tcflush(fd1,TCIOFLUSH);


回复 显示全部楼层 道具 举报

您需要登录后才可以回帖 登录 | 立即注册

小黑屋|Archiver|手机版|深圳荣品电子  

GMT+8, 2024-4-25 10:35 , Processed in 0.082445 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表