usb口的開啟讀寫操作
程式的通用性是很好的,不同的usb只需修改不同的guid
至於除錯,你怎麼除錯串列埠程式就怎麼除錯usb程式,大小方面一次性傳送和接受資料不大於64個位元組.這個可能和usb裝置有關
使用乙個guidguidhid_1查詢並開啟乙個usb裝置
extern "c" int pascal searchusbdevice()
// 取得乙個該guid相關的裝置資訊集控制代碼
hdevinfoset = ::setupdigetclassdevs((lpguid)&guidhid_1,//guid_class_usb_device, // class guid
null, // 無關鍵字
null, // 不指定父視窗控制代碼
digcf_present | digcf_deviceinte***ce); // 目前存在的裝置
// 失敗...
if (hdevinfoset == invalid_handle_value)
// 申請裝置介面資料空間
ncount = 0;
bresult = true;
for (i=0; i< 34; i++)
sp_device_inte***ce_data ifdata;
// 裝置序號=0,1,2... 逐一測試裝置介面,到失敗為止
while (bresult)
pdetail = (psp_inte***ce_device_detail_data)::globalalloc(lmem_zeroinit, predictedlength);
pdetail->cbsize = sizeof(sp_device_inte***ce_detail_data);
bresult = setupdigetinte***cedevicedetail(
hdevinfoset, // 裝置資訊集控制代碼
&ifdata, // 裝置介面資訊
pdetail, // 裝置介面細節(裝置路徑)
predictedlength, // 輸出緩衝區大小
&requiredlength, // 不需計算輸出緩衝區大小(直接用設定值)
null); // 不需額外的裝置描述
if (bresult)
ch[17]='/0';
if (strcmp(ch,"vid_0471&pid_0666")==0)//比較版本號,防止意外出錯
write_os.hevent = createevent( null, // no security
true, // explicit reset req
false, // initial event reset
null ) ; // no name
if (null == write_os.hevent)
husb=createfile(pdetail->devicepath,//&guidhid_1,//
generic_read|generic_write,
file_share_read|file_share_write,
null,
open_existing,
file_attribute_normal/*|
null);
if (husb != null)
while(id[i-1]!='#');
id[i-1] = '/0';
for (j=0; j<34; j++)
}closehandle(husb);
ncount++;
// break; }
}// 比較驅動版本
}// 比較作業系統版本
else
write_os.hevent = createevent( null, // no security
true, // explicit reset req
false, // initial event reset
null ) ; // no name
if (null == write_os.hevent)
husb=createfile(pdetail->devicepath,//&guidhid_1,//
generic_read|generic_write,
file_share_read|file_share_write,
null,
open_existing,
file_attribute_normal/*|
null);
if (husb != null)
closehandle(husb);
ncount++;
// break; }
} }} }
// 釋放裝置介面資料空間
::globalfree(pdetail);
// 關閉裝置資訊集控制代碼
::setupdidestroydeviceinfolist(hdevinfoset);
idevicecount = ncount;
return ncount; }
// 寫
bool writestr(char *buf,int buflen, int index)
div_result = div(buflen, 58);
if (div_result.rem == 0)
else
for (i=0; i", dwerror ) ;
outputdebugstring(szerror);
clearcommerror(m_gphdcom[index], &dwerrorflags, &comstat ) ;
if (dwerrorflags >0)
} else
return false; }
}if (i != packet-1)
} }
return true; }
// 讀
int readstr(char *buf,int nmaxlength, int index)
// only try to read number of bytes in queue
clearcommerror(m_gphdcom[index], &dwerrorflags, &comstat) ;
//dwlength = min( (dword) nmaxlength, comstat.cbinque ) ;
dwlength=nmaxlength;
if (dwlength > 0)
} }
else // end-----if (getlasterror() == error_io_pending)
} } // end-----if (!freadstat)
} // end-----if (olap==true)
else
} purgecomm(m_gphdcom[index],purge_rxclear|purge_txclear); }
}return dwlength; }
faq:
1,如果是指硬體(韌體),那麼先要看使用什麼usb介面晶元,根據晶元資料,編寫韌體完成傳送/接收資料的功能.如果晶元是採用帶usb hid介面的微控制器,操作更簡單,只要讀寫特殊的位址,就可以了,具體操作還要看硬體的資料
2,如果指pc程式設計,在windows下找到此裝置的符號鏈結名,用createfile開啟,然後用readfile/writefile讀寫就可以了,要用到setupapi,如果感興趣可以繼續討論
用VC 實現USB介面讀寫資料的程式
用vc 實現usb介面讀寫資料的程式 收藏 用vc 實現usb介面讀寫資料的程式 使用乙個guidguidhid 1查詢並開啟乙個usb裝置 extern c int pascal searchusbdevice 取得乙個該guid相關的裝置資訊集控制代碼 hdevinfoset setupdige...
用VC 實現USB介面讀寫資料的程式
使用乙個guidguidhid 1查詢並開啟乙個usb裝置 extern c int pascal searchusbdevice 取得乙個該guid相關的裝置資訊集控制代碼 hdevinfoset setupdigetclassdevs lpguid guidhid 1,guid class us...
USB裝置硬體 驅動 及USB口的讀寫
1.usb 裝置硬體部分 a.這個硬體的標識是用的 vender id 和 product id,即 廠家標識 和 產品標識 b.這個硬體規定了各個 end point 端點 的性質,讀 寫 及 型別 control interrupt bulk isochronous c.這個硬體的韌體裡面有 d...