通过 libusb_interrupt_transfer 返回的数据值不一致

问题描述

为usb开发的脚本来自外包。一切似乎都正常工作,但在读取操作期间,发送了一个长度为 128 字节的空缓冲区,并且在执行库 (libusb_interrupt_transfer) 后,有一个长度为 128 的更新值 (rsp)。此返回值将用于确定哪个驱动器设法切换 LED。但是,返回值总是不一致的。

代码如下:

    //@file hk_arm.cpp
void arm_comm_eusb2(char *cmd,char *rsp,int num_reads,int time_delay)
{
    int ret = 0,num;

    if(eusb_handle==NULL) {
    fprintf(stderr,"No eusb handle\n");
    return;
    }
    if(cmd==NULL) {
    fprintf(stderr,"No command buffer\n");
    return;
    }
    if(num_reads>5) num_reads = 5;
    if(num_reads<0) num_reads = 0;
    ret = libusb_interrupt_transfer((libusb_device_handle *)eusb_handle,0x04,(unsigned char *)cmd,32,&num,1000);
    if(ret < 0) {
        fprintf(stderr,"usb_interrupt_write error(cmd %s]!\n",cmd);

   }

    if (rsp == NULL) {
        return;
    }
    MyDelay(time_delay);
    while(num_reads--) {
    //intermittent result of rsp
        ret = libusb_interrupt_transfer((libusb_device_handle *)eusb_handle,0x83,(unsigned char *)rsp,128,5000);
        if(ret < 0) {
            fprintf(stderr,"usb_interrupt_read error!\n");

    } 

    }
}


int arm_read_word_eusb2(char *cmd,int* slotvalue,int time_delay)
{
char msg[32];
char rsp[128];
int i;
    memset(rsp,128);
    memset(msg,32);
    memcpy(msg,cmd,32);
    arm_comm_eusb2(msg,rsp,1,time_delay);
    //if (strncmp(rsp,"*SRESET>OK",10) == 0) {
      for(i=0; i<8; i++){
        slotvalue[i] = rsp[i*2+8]- '0';
        //slotvalue[i+8] = rsp[i*2+8]- '0';
        //fprintf(stderr,"slot %d: value=%d\n",i,slotvalue[i]);
      }
    //}
//  fprintf(stderr,"[%s]:%s\n",rsp);
    return 1;
}




void eusb_removeReset(int * slot_value,int value)
{
    char buf[32];

    memset(buf,32);
    memset(eusb_slot,sizeof(eusb_slot));
    sprintf(buf,"@RRESET %d ",value);
    arm_read_word_eusb2(buf,slot_value,value );
    return;

}


//file util.cpp
void eusb_checkrreset(int value)
{
    int i;
    int slot_value[16];
    
    if((Mach.eusb_board1 == false) && (Mach.eusb_board2 == false)){
      fprintf(stderr,"Mach.eusb_board1 and Mach.eusb_board1 are false\n");
      mark_all_devices_bad(SS_EUSBARMERR);
      return;
    }
    if(Mach.eusb_board1)
    eusb_removeReset(slot_value,value);
    if(Mach.eusb_board2)
    eusb_removeReset2(slot_value,value);
    power_recycle_all(false,1);
    for (i = 0; i < NUMSLOT; i++) {
      if (eusb_slot[i]==1){
        if (is_slot_active(i) == 0){
          fprintf(stderr,"slot %d: remove reset fail\n",i);
          flag_slot_error(i,SS_EUSBRRESETERR);
        }else
          fprintf(stderr,"slot %d: remove reset pass\n",i);
        if (slot_value[i] == 0){
          fprintf(stderr,"slot %d: activity fail\n",SS_EUSBACTERR);
        }else
          fprintf(stderr,"slot %d: activity pass\n",i);
      }
    }

}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)