用VC對USB口的開啟讀寫操作

2021-05-26 05:49:03 字數 3879 閱讀 2017

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...