PDA

View Full Version : برنامه نویسی برای usb و ارتباط با دستگاهای جانبی با usb (؟)



hosseinam1370
یک شنبه 16 فروردین 1394, 23:05 عصر
دوستان من اومدم c++ رو یاد بگیرم برای ساختن نرم افزار و ارتباط آن با میکروکنترلر ها،
از اونجایی که تمامی کامپیوتر ها usb دارن ، تصمیم به برقراری ارتباط از طریق usb گرفتم ،
سرچ زدم مطلب زیادی در مورد برنامه نویسی برای usb پیدا نکردم، و راستش هیچ اطلاعاتی در مورد usb ندارم ، و اصلا هم نمیدونم دنبال چی باید باشم ، و از کجا برای usb باید شروع کنم. فقط میدونم دردسر داره.

برای همین شما دوستان اگه لطف و حوصله کنید برای تایپ ، مارو راه بندازین ، واقعا ممنون میشم.منبعی ، کتابی چیزی .


برای گسترش نرم افزار هم دارم کیوت کار میکنم.


با تشکر.

ravaei
دوشنبه 17 فروردین 1394, 12:09 عصر
درود...

من خودم تاحالا با سی پلاس پلاس در زمینه کار با Usb و port ها و کنترل device ها (همون system.manegment تو c#) زیاد کار نکردم ولی احساس میکنم ، شما دو تا مقوله رو یکی کردید .

اول اینکه ، برنامه نویسی برای میکرو (AVR , ARM ,...) یه بحث جدایی هستش و میتونید از programmer های مختلف و کامپایلر هایی مثل codevesion , AVRstudio ... استفاده کنید .
اگه منظورتون اینه میتونید اینجا یه سری بزنید http://barnamenevis.org/forumdisplay.php?216-AVR الته این رو هم در نظر داشته باشید که بهتره شما به سزاغ C برید تا C++ چون اکثر محیط ها برای کدنویسی میکرو ها C هستش .

ولی اگه منظورتون پیمایش تو device manager هستش می تونید این مثال رو بررسی کنید :
" با کامنت توضیح داده که هر مرحله چی کار میکنه ، اول یه لیستی از device ها تهیه میکنه بعد میره اطلاعاتی در رابطه با اونا به کاربر میگه البته من خروجی نگرفتم ولی واسه آشنایی کلی بدک نیست از همه مهم تر کار با لایبرری windows.h هستش "



#include <windows.h>
#include <iostream>

// Namespace
using namespace std;

// Main
int main()
{
// Program
cout << "USB Device Lister." << endl;

// Get Number Of Devices
UINT nDevices = 0;
GetRawInputDeviceList( NULL, &nDevices, sizeof( RAWINPUTDEVICELIST ) );

// Got Any?
if( nDevices < 1 )
{
// Exit
cout << "ERR: 0 Devices?";
cin.get();
return 0;
}

// Allocate Memory For Device List
PRAWINPUTDEVICELIST pRawInputDeviceList;
pRawInputDeviceList = new RAWINPUTDEVICELIST[ sizeof( RAWINPUTDEVICELIST ) * nDevices ];

// Got Memory?
if( pRawInputDeviceList == NULL )
{
// Error
cout << "ERR: Could not allocate memory for Device List.";
cin.get();
return 0;
}

// Fill Device List Buffer
int nResult;
nResult = GetRawInputDeviceList( pRawInputDeviceList, &nDevices, sizeof( RAWINPUTDEVICELIST ) );

// Got Device List?
if( nResult < 0 )
{
// Clean Up
delete [] pRawInputDeviceList;

// Error
cout << "ERR: Could not get device list.";
cin.get();
return 0;
}

// Loop Through Device List
for( UINT i = 0; i < nDevices; i++ )
{
// Get Character Count For Device Name
UINT nBufferSize = 0;
nResult = GetRawInputDeviceInfo( pRawInputDeviceList[i].hDevice, // Device
RIDI_DEVICENAME, // Get Device Name
NULL, // NO Buff, Want Count!
&nBufferSize ); // Char Count Here!

// Got Device Name?
if( nResult < 0 )
{
// Error
cout << "ERR: Unable to get Device Name character count.. Moving to next device." << endl << endl;

// Next
continue;
}

// Allocate Memory For Device Name
WCHAR* wcDeviceName = new WCHAR[ nBufferSize + 1 ];

// Got Memory
if( wcDeviceName == NULL )
{
// Error
cout << "ERR: Unable to allocate memory for Device Name.. Moving to next device." << endl << endl;

// Next
continue;
}

// Get Name
nResult = GetRawInputDeviceInfo( pRawInputDeviceList[i].hDevice, // Device
RIDI_DEVICENAME, // Get Device Name
wcDeviceName, // Get Name!
&nBufferSize ); // Char Count

// Got Device Name?
if( nResult < 0 )
{
// Error
cout << "ERR: Unable to get Device Name.. Moving to next device." << endl << endl;

// Clean Up
delete [] wcDeviceName;

// Next
continue;
}

// Set Device Info & Buffer Size
RID_DEVICE_INFO rdiDeviceInfo;
rdiDeviceInfo.cbSize = sizeof( RID_DEVICE_INFO );
nBufferSize = rdiDeviceInfo.cbSize;

// Get Device Info
nResult = GetRawInputDeviceInfo( pRawInputDeviceList[i].hDevice,
RIDI_DEVICEINFO,
&rdiDeviceInfo,
&nBufferSize );

// Got All Buffer?
if( nResult < 0 )
{
// Error
cout << "ERR: Unable to read Device Info.. Moving to next device." << endl << endl;

// Next
continue;
}

// Mouse
if( rdiDeviceInfo.dwType == RIM_TYPEMOUSE )
{
// Current Device
cout << endl << "Displaying device " << i+1 << " information. (MOUSE)" << endl;
wcout << L"Device Name: " << wcDeviceName << endl;
cout << "Mouse ID: " << rdiDeviceInfo.mouse.dwId << endl;
cout << "Mouse buttons: " << rdiDeviceInfo.mouse.dwNumberOfButtons << endl;
cout << "Mouse sample rate (Data Points): " << rdiDeviceInfo.mouse.dwSampleRate << endl;
if( rdiDeviceInfo.mouse.fHasHorizontalWheel )
{
cout << "Mouse has horizontal wheel" << endl;
}
else
{
cout << "Mouse does not have horizontal wheel" << endl;
}
}

// Keyboard
else if( rdiDeviceInfo.dwType == RIM_TYPEKEYBOARD )
{
// Current Device
cout << endl << "Displaying device " << i+1 << " information. (KEYBOARD)" << endl;
wcout << L"Device Name: " << wcDeviceName << endl;
cout << "Keyboard mode: " << rdiDeviceInfo.keyboard.dwKeyboardMode << endl;
cout << "Number of function keys: " << rdiDeviceInfo.keyboard.dwNumberOfFunctionKeys << endl;
cout << "Number of indicators: " << rdiDeviceInfo.keyboard.dwNumberOfIndicators << endl;
cout << "Number of keys total: " << rdiDeviceInfo.keyboard.dwNumberOfKeysTotal << endl;
cout << "Type of the keyboard: " << rdiDeviceInfo.keyboard.dwType << endl;
cout << "Subtype of the keyboard: " << rdiDeviceInfo.keyboard.dwSubType << endl;
}

// Some HID
else // (rdi.dwType == RIM_TYPEHID)
{
// Current Device
cout << endl << "Displaying device " << i+1 << " information. (HID)" << endl;
wcout << L"Device Name: " << wcDeviceName << endl;
cout << "Vendor Id:" << rdiDeviceInfo.hid.dwVendorId << endl;
cout << "Product Id:" << rdiDeviceInfo.hid.dwProductId << endl;
cout << "Version No:" << rdiDeviceInfo.hid.dwVersionNumber << endl;
cout << "Usage for the device: " << rdiDeviceInfo.hid.usUsage << endl;
cout << "Usage Page for the device: " << rdiDeviceInfo.hid.usUsagePage << endl;
}

// Delete Name Memory!
delete [] wcDeviceName;
}

// Clean Up - Free Memory
delete [] pRawInputDeviceList;

// Exit
cout << endl << "Finnished.";
cin.get();
return 0;
}





موفق باشید .

hosseinam1370
دوشنبه 17 فروردین 1394, 14:05 عصر
ممون دوسته عزیز.
بله خودم برا میکرو برنامه مینویسم.
ولی نمیتونستم ارتباط بین کامپیوتر و میکرو رو برقرار کنم، که دوستانم تو فروم eca.ir گفتند که برو سمت کیوت و کیوت هم به سی++ نیاز داره ،
برا همین من از تابستون پارسال سی++ رو شروع کردم ، و به کمک دوستان همینج،در حدی شدم که برم کیوت رو شروع کنم.
حالا نیاز دارم که بتونم اطلاعات رو بین کامپیوتر و میکرو share کنم ، تصمیم به برقراری ارتباط از usb گرفتم.

ولی تو نت زیاد مطلب نداره برای آموزش. منم نمیدونم باید چیکار کنم. فعلا موندم.
الان برم سرآیند windos.h رو بررسی کنم ، ببینم چیه.

برا کیوت هم انگار چیزی نیست برای ارتباط با usb.

با تشکر.

shahin bahari
دوشنبه 17 فروردین 1394, 16:27 عصر
برای شروع به نظرم بهتر هست که فعلا با کلاس های آماده کار کنید که هم برنامه سمت میکرو اون راحت تر پیاده بشه و هم سمت PC. کلاس CDC و HID به نظرم الان برای کار شما مناسب هست.

hosseinam1370
دوشنبه 17 فروردین 1394, 18:26 عصر
برای شروع به نظرم بهتر هست که فعلا با کلاس های آماده کار کنید که هم برنامه سمت میکرو اون راحت تر پیاده بشه و هم سمت PC. کلاس CDC و HID به نظرم الان برای کار شما مناسب هست.

چجوری هست این توابع کار با usb ? برای کلاس cdc و hid ?
منظورم اینه که با کنسول سی هم میشه دسترسی داشت؟!!یا اصلا ربطی به زبان نداره!!! یعنی با هر زبانی دسترسی به این توابع میشه داشت یا نه؟!!

یا باید فقط از زبان سی برای usb استفاده کنیم؟


با تشکر.

حامد مصافی
دوشنبه 17 فروردین 1394, 19:38 عصر
libusb (http://libusb.sourceforge.net/) رو ببین