打印

gd32e103 usb_cdc_acm收发有问题

[复制链接]
3949|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
static void usb_protocol(struct tec_pid_control *__tec)
{
    int16_t idx = 0;
    uint16_t curr[TEC_ADC_SUM] = {0};
    float temp_f = 0.0;
    uint8_t *ptr = (uint8_t *)&temp_f;
    usb_cdc_handler *cdc = (usb_cdc_handler *)__tec->p_cdc_acm->dev.class_data[0];

    if (USBD_CONFIGURED == __tec->p_cdc_acm->dev.cur_status){
        if (0U == cdc_acm_check_ready(__tec->p_cdc_acm)){
            cdc_acm_data_receive(__tec->p_cdc_acm);
        }
        else{
            idx = get_header_cmd();
            switch (idx){
            case -1:
                break;
            case set_mode:
                break;
            case set_temp:
                memcpy(ptr, &cdc->data[2], sizeof(float));
                max5214_write(temp_conver_dac_value(temp_f));
                cdc->data[0] = 0x55;
                cdc->data[1] = 0x02;
                cdc->data[3] = 0x01;
                cdc->data[4] = 0x00;
                cdc->data[5] = 0x00;
                cdc->data[6] = crc_8_calculate(cdc->data, 6);
                break;
            case set_prop:
                break;
            case set_intg:
                break;
            case set_diff:
                break;
            case read_name:
                memcpy(cdc->data, "temperature controller\n", sizeof("temperature controller\n"));
                cdc->receive_length = sizeof("temperature controller\n") - 1;
                break;
            case read_vers:
                memcpy(cdc->data, "V1.00.01\n", sizeof("V1.00.01\n"));
                cdc->receive_length = sizeof("V1.00.01\n") - 1;
                break;
            case read_sn:
                memcpy(cdc->data, "20210907002\n", sizeof("20210907002\n"));
                cdc->receive_length = sizeof("20210907002\n") - 1;
                break;
            case read_data:
                get_tec_current(__tec->p_adc->value, TEC_ADC_SUM, curr);
                cdc->data[0] = 0x5a;
                cdc->data[1] = 0x04;
                memcpy(&cdc->data[2], (uint8_t *)&curr, 10);
                cdc->data[12] = crc_8_calculate(cdc->data, 12);
                cdc->receive_length = 13;
                break;
            default:
                break;
            }
            cdc_acm_data_send(__tec->p_cdc_acm);
        }
    }
}

如图,发送什么有时候就会回什么,概率还很高,是我代码哪出问题了吗?希望有大神能指点一二。

使用特权

评论回复
沙发
yangxiaor520| | 2021-10-14 07:59 | 只看该作者
一上来就是一堆代码

使用特权

评论回复
板凳
风来吴山|  楼主 | 2021-10-14 09:10 | 只看该作者
修改官方库cdc_acm_core.h文件,在usb_cdc_handler结构体中加入第50行即可解决。

使用特权

评论回复
地板
mutable| | 2021-10-15 17:21 | 只看该作者
都解决完了,我也没看懂咋回事

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

40

帖子

1

粉丝