خوب اینم آخرین قسمت ارسال و در یافت داده
دیگه بقیه رو هم مثل HID و انتقال تعداد زیاد تری از داده و اینا اگه استقبال شد میزارم
اول از همه ارسال داده از دستگاه به رایانه
1- "usbFunctionRead" رو خودتون بنویسید (اگه حالشو دارید!)
2- متغیری به نام "usbMsgPtr" هست که میتونید ادرس اسرم رو بهش بدید تا داده رو بفرسته
ماهم که معلومه روش دوم رو انتخاب می کنیم
به برنامه ی میکرو اینارو اضافه می کنیم
کد:
#define USB_DATA_OUT 2
static unsigned char replyBuf[16] = "Hello,IRANLED!";
حالا به برنامه ی خودمون در تابع "usbFunctionSetup()" این حالت رو هم اضافه می کنیم
کد:
case USB_DATA_OUT: // send data to PC
usbMsgPtr = &replyBuf;
return sizeof(replyBuf);
حالا توی برنامه ی رایانه اون جایی که بررسی می کردیم on با off گرفتیم این کد رو اضافه میکنیم تا یه حالت دیگه رو هم بررسی بکنه
کد:
} else if(strcmp(argv[1], "out") == 0) {
nBytes = usb_control_msg(handle,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
USB_DATA_OUT, 0, 0, (char *)buffer, sizeof(buffer), 5000);
printf("Got %d bytes: %sn", nBytes, buffer);
}
فقط حواستون باشه اگه داده زیاد می فرستید یا میگیرید یه جوری حساب کنید SRAM پر نشه
-------
حالا دریافت داده از رایانه
یکی از راحت ترین کار ها استفاده از دو متغییر "wValue" و "wIndex" هست البته یه محدودیتی داره اونم اینه که فقط 4 بایت رو میشه هم زمان انتقال داد!
حالا بریم و توی هر دوتابرنامه اینو اضافه کنید
کد:
#define USB_DATA_WRITE 3
و توس برنامه ی میکرو این حالت رو دوباره به همون تابع قبلی اضافه می کنیم
کد:
case USB_DATA_WRITE: // modify reply buffer
replyBuf[7] = rq->wValue.bytes[0];
replyBuf[8] = rq->wValue.bytes[1];
replyBuf[9] = rq->wIndex.bytes[0];
replyBuf[10] = rq->wIndex.bytes[1];
return 0;
توجه کنید اینا انیون هستن اگه خواستید با ".word" کل 16 بیت رو هم بخونید
توی قسمت رایانه هم این کد رو دوباره به ادامه ی قسمت قبل اضافه کنید
کد:
} else if(strcmp(argv[1], "write") == 0) {
nBytes = usb_control_msg(handle,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
USB_DATA_WRITE, 'I' + ('R' << 8), 'A' + ('N' << 8),
(char *)buffer, sizeof(buffer), 5000);
}
توجه کنید دیگه یه جوری که میدونین داده یه دریافت شده رو نمایش بدید ولی یادتون باشه چون توی همون متغییر قبلی مینویسیم اگه دوباره از میکرو داده بخونید یه متن جدید نمایش داده میشه که این قبلی وسط هست پس اگه خواستید میتونید بعد از نمایش دوباره متغییر رو به متن قبلی برگردونید
-----
اما اگه خواستیم داده ی بیشتری انتقال بدیم
اینو به برنامه کامپیوتر اضافه کنید
کد:
#define USB_DATA_IN 4
دوباره این رو هم به بقیه برنامه اضافه کنید تا دوباره یه حالت دیگه رو هم بررسی بکنه
کد:
} else if(strcmp(argv[1], "in") == 0 && argc > 2) {
nBytes = usb_control_msg(handle,
USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT,
USB_DATA_IN, 0, 0, argv[2], strlen(argv[2])+1, 5000);
}
حالا وقتی شما توی CMD برنامه رو ران بکنی با in بعدش هم باید متنی که میخوای رو بنویسی
یادتون باشه که حداکثر 16 بایت رو میتونید انتقال بدید
اما توی میکرو اینا رو اضافه کنید
کد:
#define USB_DATA_IN 4
static unsigned char dataReceived = 0, dataLength = 0; // for USB_DATA_IN
و دو باره به اون جایی که حالت ها رو بررسی میکرد این رو هم اضافه می کنیم
کد:
case USB_DATA_IN: // receive data from PC
dataLength = (uchar)rq->wLength.word;
dataReceived = 0;
if(dataLength > sizeof(replyBuf)) // limit to buffer size
dataLength = sizeof(replyBuf);
return USB_NO_MSG; // usbFunctionWrite will be called now
حالا همون طوری که نوشتم یه تابعی به نام "usbFunctionWrite " اجرا میشه تا داده رو بخونه
پس تابع رو اینطوری تعریف میکنیم
کد:
extern unsigned char usbFunctionWrite(unsigned *data, unsigned len) {
unsigned i;
for(i = 0; dataReceived < dataLength && i < len; i++, dataReceived++)
replyBuf[dataReceived] = data[i];
return (dataReceived == dataLength); // 1 if we received it all, 0 if not
}
توی فایل "usbconfig.h" هم به دنبال متن زیر برید و تغییرش بدید
کد:
#define USB_CFG_IMPLEMENT_FN_WRITE 1
این به برنامه میگه یه همچین تابعی برای خوندن اضافه کردیم
به سلامتی کار ما تموم شد اگه خیلی توضیح ندادم منا رو بر این گذاشتم که دیگه مقدمات رو میدونید و با دیدن کد ها خیلی چیز هارو می فهمید وگرنه خیلی پست هام طولانی میشد ولی به هرحال مشکلی بود بگید تا توضیح بدم
اینی که کسی بین پست های من چیزی نگفته یا اینه که ملت برد رو نساختن یا موضوع جالب نبوده ولی به هر حال قدردانی میکنم که جلوی خودتون رو گرفتید تا آموزش پشت سر هم باشه و کامل باشه.
از توجه شما سپاس گزاریم
(اینم شکلک های جدید
)
یا حق ...