ZYH10140 2021-12-08 18:09 采纳率: 0%
浏览 48
已结题

串口发送数据,当大于4096时,调用write是返回4095,设置缓存区大小,但是不好使,求指导,代码如下:

1.想通过串口传输大数据,在发送端,每次发送都只能发送4095;数据太多需要分多包发送,处理起来太麻烦,因此求方法。核心代码如下:

//设置串口缓存区等  好像没用,不知道是不是设置成了接收缓存区了?
int UartBuffSizeSet(int argc, char *argv[], char *dev_path,int size) 
{  
    int ret;
    int fd =  open(dev_path, O_RDWR | O_NOCTTY | O_NONBLOCK);
    if(fd < 0){
        return -1;
    }

        //设置属性
    int i = 0;
    printf("====> argc:%d\n", argc);
    for(i = 0; i < argc; i++)
    {
        printf("====> argv[%d] = %s\n", i, argv[i]);
    }
    if(argc > 1)
        set_speed(fd, atoi(argv[1]));
    else
        set_speed(fd, 115200);
    set_Parity(fd, 8, 1, 'n');
    
    struct serial_struct serial;
    ret = ioctl(fd, TIOCGSERIAL, &serial);
    if (ret != 0) {
        close(fd);
        printf("error: get uart buff size is failed !\n");
        return -2;
    }
    printf("Get uart buff size(%d) successed ret:%d!\n", serial.xmit_fifo_size, ret);
    
    serial.xmit_fifo_size = 8*1024; //8k 
    ret = ioctl(fd, TIOCSSERIAL, &serial);
    if(ret != 0) {
        close(fd);
        printf("error: set uart buff size is failed !\n");
        return -3;
    }
    printf("Set uart buff size(%d) successed ret:%d !\n", serial.xmit_fifo_size, ret);

    
    struct serial_struct serial2;
    ret = ioctl(fd, TIOCGSERIAL, &serial2);
    if (ret != 0) {
        close(fd);
        printf("error: get uart buff size is failed !\n");
        return -2;
    }
    printf("Get uart buff size(%d) successed ret:%d!\n", serial2.xmit_fifo_size, ret);
    
    //写数据
    int data = 4;
    char buf[1024*1024] = {0};
    memset(buf, 0x66, sizeof(buf));
    if(argc > 2 && atoi(argv[2]) < 1024 && atoi(argv[2]) > 0)
        data = atoi(argv[2]);
    
    ret = writen(fd, buf, data * 1024);
    
    printf("=====> end:time:%lld \n", getSysTimeMs());
    printf("write data len(%d) uart max seng buf len(%d); real send data len(%d)\n", data * 1024, serial.xmit_fifo_size, ret);
        
    // ret = 0;
    // while(1)
    // {
        // printf("=====> begin:time:%lld \n", getSysTimeMs());
        // ret = writen(fd, buf, data * 1024);
        
        // printf("=====> end:time:%lld \n", getSysTimeMs());
        // printf("write data len(%d) uart max seng buf len(%d); real send data len(%d)\n", data * 1024, serial.xmit_fifo_size, ret);
        
        // printf("====>Please enter any key to continue! \n");
        // char buf[1024] = {0};
        // scanf("%s", buf);
    // }
    //读数据
    close(fd);
    return 0;
}
//发送函数
ssize_t writen(int fd, const void *ptr, size_t n)
{
    size_t nleft;
    ssize_t nwritten;

    nleft = n;
    while(nleft > 0)
    {
        if ((nwritten = write(fd, ptr, nleft)) < 0)
        {
            // perror("write()");
            //printf("====> nwritten:%d \n", nwritten);
            if (nleft == n)
            {
                return -1;//error, return -1
            }
            else
            {
                // if(nleft > 0/* && check_fd_fine(fd) >= 0*/)
                // {
                    // usleep(20);
                    // continue;
                // }
                // else
                    break;//error, return amount written so far
            }
        }
        else if (nwritten == 0)
        {
            break;
        }
        
        nleft -= nwritten;
        printf("====>n:%d nwritten:%d nleft:%d \n", n, nwritten, nleft);
        ptr += nwritten;
    }

    return (n - nleft);//reutrn >=0

}

  • 写回答

1条回答 默认 最新

  • 有问必答小助手 2021-12-10 10:19
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答


    本次提问扣除的有问必答次数,将会以问答VIP体验卡(1次有问必答机会、商城购买实体图书享受95折优惠)的形式为您补发到账户。


    因为有问必答VIP体验卡有效期仅有1天,您在需要使用的时候【私信】联系我,我会为您补发。

    评论

报告相同问题?

问题事件

  • 系统已结题 12月16日
  • 创建了问题 12月8日

悬赏问题

  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题