问题描述
为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 (将#修改为@)