Shakesbeer
Постоялец
Offline
|
|
« : 15-02-2013 13:20 » |
|
Хочу начать работу с CY7C68013 Изучил множество материалов, но большинство программ написано либо на асемблере, либо на Visual. Есть где-нибудь материал и примеры, написанные на C++ Builder 6 ?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #1 : 15-02-2013 13:54 » |
|
начать надо конечно с документации))) http://www.cypress.com/?id=193и простите.... вы драйвер на C++ Builder 6 хотите написать? а если просто надо общаться с устройством - смотрите SDK по ссылке, а Builder у вас или MSVC разницы нет. вам нужно CyAPI. документация есть в SDK.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #2 : 15-02-2013 15:02 » |
|
Спасибо. Хоть знаю что в случае простого общения нужен только CyAPI )) Документацию изучил, но без конкретного примера пока не могу сообразить. А все что нахожу как правило в Visual С.
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #3 : 15-02-2013 15:08 » |
|
Shakesbeer, если программировать в рамках Win32 API, то разницы между VC и BCB нет.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Ochkarik
|
|
« Ответ #4 : 16-02-2013 03:23 » |
|
Shakesbeer, примеры там тоже были вроде... просто не смотрите как там окошки реализованы) у сайпреса для этой м/с свой драйвер есть, а так же интерфейсная библиотека через которую все работают. CyAPI - как раз от библиотеки.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #5 : 28-02-2013 12:24 » |
|
Shakesbeer, примеры там тоже были вроде... просто не смотрите как там окошки реализованы) у сайпреса для этой м/с свой драйвер есть, а так же интерфейсная библиотека через которую все работают. CyAPI - как раз от библиотеки.
Кстати с CyAPI до какой скорости передачи данных можно дойти?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #6 : 28-02-2013 14:14 » |
|
понятия не имею, кажется народ на их форуме писал что 42мбайт получалось, но это с чужих слов. у меня получилось на своем драйвере 48мбайт. что есть 80% от 480мбит. граница довольно четкая.
|
|
« Последнее редактирование: 28-02-2013 14:17 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #7 : 01-03-2013 10:55 » |
|
По примеру CyAPI сделал простенький примерчик: //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { CCyUSBDevice *USBDevice; char buf[512]; string s; USB_DEVICE_DESCRIPTOR descr; USBDevice = new CCyUSBDevice(NULL); // Create an instance of CCyUSBDevice GroupBox1->Caption = "device count " + AnsiString(USBDevice->DeviceCount()); if (USBDevice->DeviceCount()) for (int c=0; c < USBDevice->DeviceCount(); c++) { if (USBDevice->Open(c)) { Memo1->Clear(); int vID = USBDevice->VendorID; int pID = USBDevice->ProductID; Label[0]->Caption = "VendorID: " + AnsiString(IntToHex(vID,4)); Label[1]->Caption = "ProductID: " + AnsiString(IntToHex(pID,4)); CCyUSBConfig cfg = USBDevice->GetUSBConfig(c); USBDevice->GetDeviceDescriptor(&descr); Label[2]->Caption = "bLength 0x" + AnsiString(IntToHex(descr.bLength,2)); Label[3]->Caption = "bDescriptorType 0x" + AnsiString(IntToHex(descr.bDescriptorType,2)); Label[4]->Caption = "bcdUSB 0x" + AnsiString(IntToHex(descr.bcdUSB,4)); Label[5]->Caption = "bDeviceClass 0x" + AnsiString(IntToHex(descr.bDeviceClass,2)); Label[6]->Caption = "bDeviceProtocol 0x" + AnsiString(IntToHex(descr.bDeviceProtocol,2)); Label[7]->Caption = "bMaxPacketSize0 0x" + AnsiString(IntToHex(descr.bMaxPacketSize0,2)); Label[8]->Caption = "idVendor 0x" + AnsiString(IntToHex(descr.idVendor,4)); Label[9]->Caption = "idProduct 0x" + AnsiString(IntToHex(descr.idProduct,4)); Label[10]->Caption = "bcdDevice 0x" + AnsiString(IntToHex(descr.bcdDevice,4)); Label[11]->Caption = "iManufacturer 0x" + AnsiString(IntToHex(descr.iManufacturer,2)); Label[12]->Caption = "iProduct 0x" + AnsiString(IntToHex(descr.iProduct,2)); Label[13]->Caption = "iSerialNumber 0x" + AnsiString(IntToHex(descr.iSerialNumber,2)); Label[14]->Caption = "bNumConfigurations 0x" + AnsiString(IntToHex(descr.bNumConfigurations,2)); // USBDevice->Close(); for (int i=0; i<cfg.AltInterfaces; i++) { CCyUSBInterface *ifc = cfg.Interfaces[i]; Memo1->Lines->Add("Interface Descriptor:"); Memo1->Lines->Add("----------------------"); Memo1->Lines->Add("bLength 0x" + AnsiString(IntToHex(ifc->bLength,4))); Memo1->Lines->Add("bDescriptorType 0x" + AnsiString(IntToHex(ifc->bDescriptorType,4))); Memo1->Lines->Add("bInterfaceNumber 0x" + AnsiString(IntToHex(ifc->bInterfaceNumber,4))); Memo1->Lines->Add("bAlternateSetting 0x" + AnsiString(IntToHex(ifc->bAlternateSetting,4))); Memo1->Lines->Add("bNumEndpoints 0x" + AnsiString(IntToHex(ifc->bNumEndpoints,4))); Memo1->Lines->Add("bInterfaceClass 0x" + AnsiString(IntToHex(ifc->bInterfaceClass,4))); Memo1->Lines->Add("********************************************************************");
for (int e=0; e<ifc->bNumEndpoints; e++) { CCyUSBEndPoint *ept = ifc->EndPoints[e+1]; Memo1->Lines->Add("EndPoint Descriptor" + AnsiString(e+1) + ":"); Memo1->Lines->Add("----------------------"); Memo1->Lines->Add("bLength 0x" + AnsiString(IntToHex(ept->DscLen, 4))); Memo1->Lines->Add("bDescriptorType 0x" + AnsiString(IntToHex(ept->DscType, 4))); Memo1->Lines->Add("bEndpointAddress 0x" + AnsiString(IntToHex(ept->Address, 4))); Memo1->Lines->Add("bmAttributes 0x" + AnsiString(IntToHex(ept->Attributes, 4))); Memo1->Lines->Add("wMaxPacketSize 0x" + AnsiString(IntToHex(ept->MaxPktSize,4))); Memo1->Lines->Add("bInterval 0x" + AnsiString(IntToHex(ept->Interval, 4))); Memo1->Lines->Add("********************************************************************"); } } } else { GroupBox1->Caption = "No device found"; } } else { Label[0]->Caption = "VendorID: "; Label[1]->Caption = "ProductID: "; Label[2]->Caption = "bLength "; Label[3]->Caption = "bDescriptorType "; Label[4]->Caption = "bcdUSB "; Label[5]->Caption = "bDeviceClass "; Label[6]->Caption = "bDeviceProtocol "; Label[7]->Caption = "bMaxPacketSize0 "; Label[8]->Caption = "idVendor "; Label[9]->Caption = "idProduct "; Label[10]->Caption = "bcdDevice "; Label[11]->Caption = "iManufacturer "; Label[12]->Caption = "iProduct "; Label[13]->Caption = "iSerialNumber "; Label[14]->Caption = "bNumConfigurations "; Memo1->Text = "No device"; } //USBDevice->GetDeviceDescriptor(&descr); USBDevice->Close(); //_getch(); } //--------------------------------------------------------------------------- Все работает, все хорошо. Но никак не пойму как организовать прием-передачу. Нашел чужой код с разбитыми функциями, но никак не получается все организовать по-человечески: static CCyUSBDevice *s_usb_device; static CCyUSBEndPoint *s_in_fifo_endpoint, *s_out_fifo_endpoint; static CCyControlEndPoint* s_control_endpoint; static OVERLAPPED s_out_overlap, s_in_overlap; static unsigned char *s_in_context, *s_out_context; int s_has_to_close_out, s_has_to_close_in; LONG s_buffer_size_out, s_buffer_size_in; PUCHAR s_buffer_out, s_buffer_in;
// For now it is static, might change it to a dynamic later //--------------------------------------------------------------------------- void* usb_init(void) { int i = 0; s_usb_device = new CCyUSBDevice();
// open my device if (s_usb_device->DeviceCount()) { // search for all connected devices, and add the one that has the right name for (i = 0; i < s_usb_device->DeviceCount(); i++) { s_usb_device->Open(i); /* if(strcmp (USB_DEVICE_NAME, s_usb_device->DeviceName) == 0) //ñðàâíèâàåì ñ íàøèì èìåíåì break; s_usb_device->Close(); } } else { // Cannot find my device if (Application->MessageBox("Cannot find my device","Îøèáêà", MB_OK) != IDOK) return NULL; */ } } if (!s_usb_device->IsOpen()) { // Could not open my device if (Application->MessageBox("Could not open my device","Îøèáêà", MB_OK) != IDOK) return NULL; }
// get usb IN and OUT FIFOs endpoints int endpoints_count = s_usb_device->EndPointCount();
for (i=1; i<endpoints_count; i++) { CCyUSBEndPoint *endpoint; endpoint = s_usb_device->EndPoints[i]; if (endpoint->Attributes == 2) { // it is a Bulk endpoint if(endpoint->Address == 0x86) { // my IN endpoint s_in_fifo_endpoint = endpoint; } if(endpoint->Address == 0x02) { // my OUT endpoint s_out_fifo_endpoint = endpoint; } } } // get Control enpoint s_control_endpoint = s_usb_device->ControlEndPt; // create events for data transfers s_out_overlap.hEvent = CreateEventA(NULL, false, false, "CYUSB_OUT"); s_in_overlap.hEvent = CreateEventA(NULL, false, false, "CYUSB_IN"); return (void*)1; } //--------------------------------------------------------------------------- int usb_finish_in_transfer() { if (s_has_to_close_in == 1) { s_in_fifo_endpoint->FinishDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap,s_in_context); } s_has_to_close_in = 0; return s_buffer_size_in; } //--------------------------------------------------------------------------- int usb_finish_out_transfer() { if (s_has_to_close_out == 1) { s_out_fifo_endpoint->FinishDataXfer(s_buffer_out, s_buffer_size_out, &s_out_overlap,s_out_context); } s_has_to_close_out = 0; return s_buffer_size_out; } //--------------------------------------------------------------------------- void usb_close() { usb_finish_in_transfer(); usb_finish_out_transfer(); delete s_usb_device; CloseHandle(s_out_overlap.hEvent); CloseHandle(s_in_overlap.hEvent); } //--------------------------------------------------------------------------- void usb_begin_out_transfer(unsigned char* buffer, int size) { if (s_has_to_close_out == 1) { s_out_fifo_endpoint->FinishDataXfer (s_buffer_out, s_buffer_size_out, &s_out_overlap,s_out_context); } s_buffer_out = buffer; s_buffer_size_out = size; s_out_context = s_out_fifo_endpoint->BeginDataXfer(s_buffer_out, s_buffer_size_out, &s_out_overlap); s_has_to_close_out = 1; } //--------------------------------------------------------------------------- void usb_begin_in_transfer(unsigned char* buffer, int size) { if (s_has_to_close_in == 1) { s_in_fifo_endpoint->FinishDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap,s_in_context); } s_buffer_in = buffer; s_buffer_size_in = size; s_in_context = s_in_fifo_endpoint->BeginDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap); s_has_to_close_in = 1; } //--------------------------------------------------------------------------- int usb_is_in_transfer_done() { return s_in_fifo_endpoint->WaitForXfer(&s_in_overlap,1); } //--------------------------------------------------------------------------- int usb_is_out_transfer_done() { return s_out_fifo_endpoint->WaitForXfer(&s_out_overlap,1); } //--------------------------------------------------------------------------- void usb_wait_in_transfer_finish() { while(!s_in_fifo_endpoint->WaitForXfer(&s_in_overlap,1)); } //--------------------------------------------------------------------------- void usb_wait_out_transfer_finish() { while(!s_out_fifo_endpoint->WaitForXfer(&s_out_overlap,1)); }
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #8 : 01-03-2013 15:43 » |
|
а в чем конкретно проблема? вы SDK смотрели?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #9 : 12-03-2013 13:12 » |
|
Привет всем. кто-нибудь может помочь в таком вопросе. в общем необходимо на CY7C68013 в Билдере написать интерфейс usb для обмена данными? может быть у кого нибудь есть какие нибудь уже файлы, для обмена данными. а то сам не знаком с usb в принципе. есть только эта библиотека CyAPI и не очень понятно, что нужно использовать в программе. Жду ответа...
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #10 : 12-03-2013 15:29 » |
|
см. ответы выше)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #11 : 14-03-2013 13:52 » |
|
а как нужно настроить cyusb.inf файл?
Добавлено через 48 минут и 1 секунду: А что делать если я установил драйвер, система видит плату, но пишет что она работает неверно и в диспетчере устройств имеет воскл знак?
Добавлено через 2 часа, 2 минуты и 54 секунды: А что делать если я установил драйвер, система видит плату, но пишет что она работает неверно и в диспетчере устройств имеет воскл знак?
|
|
« Последнее редактирование: 14-03-2013 16:43 от xenetron »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #12 : 14-03-2013 17:02 » |
|
1. поменять в inf - девайс и вендор ID соответственно вашему устройству. (см свойства обнаруженного устройства в дереве устройств) 2. посмотреть код ошибки установки драйвера. там же.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #13 : 18-03-2013 11:51 » |
|
а в чем конкретно проблема?
Просто хочется увидеть рабочий пример и от него отталкиваться) И хочу спросить: верно ли написаны функции, которые я выложил ранее? Потому что собрать из них что-то дельное не получается, появляются ошибки.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #14 : 18-03-2013 13:28 » |
|
увы, примеры только те, которые шли в SDK...
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #15 : 18-03-2013 13:55 » |
|
увы, примеры только те, которые шли в SDK...
Разбирался с CyAPI из Cypress Suite USB 3.4.7. Не смог понять где конкретно описывается считывание данных) Если есть возможность - объясните.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #16 : 18-03-2013 14:20 » |
|
Cypress Suite USB 3.4.4\CyAPI\examples\cybulk\BulkLoopDlg.cpp функция XferLoop() Добавлено через 4 минуты и 21 секунду:в частности, запрос в два ендпоинта, ожидание 2 сек, проверка статуса. UCHAR *outContext = dlg->OutEndpt->BeginDataXfer(data,outlen,&outOvLap); UCHAR *inContext = dlg->InEndpt->BeginDataXfer(inData,inlen,&inOvLap);
dlg->OutEndpt->WaitForXfer(&outOvLap,2000); dlg->InEndpt->WaitForXfer(&inOvLap,2000);
success = dlg->OutEndpt->FinishDataXfer(data, outlen, &outOvLap,outContext); success = dlg->InEndpt->FinishDataXfer(inData,inlen, &inOvLap,inContext); PS это грубо на вскидку исключительно по названиям функций. надо доку читать более подробно конечно.
|
|
« Последнее редактирование: 18-03-2013 14:26 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #17 : 18-03-2013 14:30 » |
|
Вот пример моего кода. Выдает ошибку "Acces violation": //--------------------------------------------------------------------------- #include <windows.h> #include <stdio.h> #include <conio.h> #include <iostream.h> #include <vcl.h> #pragma hdrstop
#include "cyapi.h" #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" //#define USB_DEVICE_NAME "MCUCY7C68013x" //èìÿ óñòðîéñòâà (äðàéâåð) TForm1 *Form1; TLabel *Label[16];
static CCyUSBDevice *s_usb_device; static CCyUSBEndPoint *s_in_fifo_endpoint, *s_out_fifo_endpoint; static CCyControlEndPoint* s_control_endpoint; static OVERLAPPED s_out_overlap, s_in_overlap; static unsigned char *s_in_context, *s_out_context; int s_has_to_close_out, s_has_to_close_in; LONG s_buffer_size_out, s_buffer_size_in; PUCHAR s_buffer_out, s_buffer_in;
// For now it is static, might change it to a dynamic later //--------------------------------------------------------------------------- void* usb_init(void) { int i = 0; s_usb_device = new CCyUSBDevice();
// open my device if (s_usb_device->DeviceCount()) { // search for all connected devices, and add the one that has the right name for (i = 0; i < s_usb_device->DeviceCount(); i++) { s_usb_device->Open(i); /* if(strcmp (USB_DEVICE_NAME, s_usb_device->DeviceName) == 0) //ñðàâíèâàåì ñ íàøèì èìåíåì break; s_usb_device->Close(); } } else { // Cannot find my device if (Application->MessageBox("Cannot find my device","Îøèáêà", MB_OK) != IDOK) return NULL; */ } } if (!s_usb_device->IsOpen()) { // Could not open my device if (Application->MessageBox("Could not open my device","Îøèáêà", MB_OK) != IDOK) return NULL; }
// get usb IN and OUT FIFOs endpoints int endpoints_count = s_usb_device->EndPointCount();
for (i=1; i<endpoints_count; i++) { CCyUSBEndPoint *endpoint; endpoint = s_usb_device->EndPoints[i]; if (endpoint->Attributes == 2) { // it is a Bulk endpoint if(endpoint->Address == 0x86) { // my IN endpoint s_in_fifo_endpoint = endpoint; } if(endpoint->Address == 0x02) { // my OUT endpoint s_out_fifo_endpoint = endpoint; } } } // get Control enpoint s_control_endpoint = s_usb_device->ControlEndPt; // create events for data transfers s_out_overlap.hEvent = CreateEventA(NULL, false, false, "CYUSB_OUT"); s_in_overlap.hEvent = CreateEventA(NULL, false, false, "CYUSB_IN"); return (void*)1; } //--------------------------------------------------------------------------- int usb_finish_in_transfer() { if (s_has_to_close_in == 1) { s_in_fifo_endpoint->FinishDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap,s_in_context); } s_has_to_close_in = 0; return s_buffer_size_in; } //--------------------------------------------------------------------------- int usb_finish_out_transfer() { if (s_has_to_close_out == 1) { s_out_fifo_endpoint->FinishDataXfer(s_buffer_out, s_buffer_size_out, &s_out_overlap,s_out_context); } s_has_to_close_out = 0; return s_buffer_size_out; } //--------------------------------------------------------------------------- void usb_close() { usb_finish_in_transfer(); usb_finish_out_transfer(); delete s_usb_device; CloseHandle(s_out_overlap.hEvent); CloseHandle(s_in_overlap.hEvent); } //--------------------------------------------------------------------------- void usb_begin_out_transfer(unsigned char* buffer, int size) { if (s_has_to_close_out == 1) { s_out_fifo_endpoint->FinishDataXfer (s_buffer_out, s_buffer_size_out, &s_out_overlap,s_out_context); } s_buffer_out = buffer; s_buffer_size_out = size; s_out_context = s_out_fifo_endpoint->BeginDataXfer(s_buffer_out, s_buffer_size_out, &s_out_overlap); s_has_to_close_out = 1; } //--------------------------------------------------------------------------- void usb_begin_in_transfer(unsigned char* buffer, int size) { if (s_has_to_close_in == 1) { s_in_fifo_endpoint->FinishDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap,s_in_context); } s_buffer_in = buffer; s_buffer_size_in = size; s_in_context = s_in_fifo_endpoint->BeginDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap); s_has_to_close_in = 1; } //--------------------------------------------------------------------------- int usb_is_in_transfer_done() { return s_in_fifo_endpoint->WaitForXfer(&s_in_overlap,1); } //--------------------------------------------------------------------------- int usb_is_out_transfer_done() { return s_out_fifo_endpoint->WaitForXfer(&s_out_overlap,1); } //--------------------------------------------------------------------------- void usb_wait_in_transfer_finish() { while(!s_in_fifo_endpoint->WaitForXfer(&s_in_overlap,1)); } //--------------------------------------------------------------------------- void usb_wait_out_transfer_finish() { while(!s_out_fifo_endpoint->WaitForXfer(&s_out_overlap,1)); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { usb_init(); char buf[8]; usb_begin_in_transfer(buf, 8); usb_is_in_transfer_done(); usb_finish_in_transfer(); usb_wait_in_transfer_finish(); usb_close(); }
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #18 : 18-03-2013 14:33 » |
|
где выдает?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #19 : 18-03-2013 14:36 » |
|
UCHAR *outContext = dlg->OutEndpt->BeginDataXfer(data,outlen,&outOvLap); //начало передачи data, длиной outlen UCHAR *inContext = dlg->InEndpt->BeginDataXfer(inData,inlen,&inOvLap); //начало передачи indata, длиной inlen
dlg->OutEndpt->WaitForXfer(&outOvLap,2000); //ждем передачи 2000 мкс dlg->InEndpt->WaitForXfer(&inOvLap,2000); //ждем приема 2000 мкс
success = dlg->OutEndpt->FinishDataXfer(data, outlen, &outOvLap,outContext); // это проверка отосланы байты или нет success = dlg->InEndpt->FinishDataXfer(inData,inlen, &inOvLap,inContext); // проверка приняты байты или нет Как-то так? Добавлено через 58 секунд: где выдает?
//--------------------------------------------------------------------------- void usb_begin_in_transfer(unsigned char* buffer, int size) { if (s_has_to_close_in == 1) { s_in_fifo_endpoint->FinishDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap,s_in_context); } s_buffer_in = buffer; s_buffer_size_in = size; ---> s_in_context = s_in_fifo_endpoint->BeginDataXfer(s_buffer_in, s_buffer_size_in, &s_in_overlap); <--- Вот в этом месте s_has_to_close_in = 1; } //---------------------------------------------------------------------------
|
|
« Последнее редактирование: 18-03-2013 14:37 от Shakesbeer »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #20 : 18-03-2013 14:40 » |
|
вроде похоже. я не смотрел доку)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #21 : 18-03-2013 14:43 » |
|
вроде похоже. я не смотрел доку)
Попробую пока в bulkLoopDlg покопаться)
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #22 : 18-03-2013 14:46 » |
|
endpoints_count - чему равен?
Добавлено через 40 секунд: проверка на то что s_in_fifo_endpoint вообще какой то существует - где?
|
|
« Последнее редактирование: 18-03-2013 14:46 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #23 : 18-03-2013 14:51 » |
|
endpoints_count - чему равен?
Добавлено через 40 секунд: проверка на то что s_in_fifo_endpoint вообще какой то существует - где?
Задается в ф-ции void* usb_init(void) int endpoints_count = s_usb_device->EndPointCount(); проверка на то что s_in_fifo_endpoint вообще какой то существует - где? То-есть банально сравнить с нулевым значением и отменять дальнейшее выполнение, если < 1?
|
|
« Последнее редактирование: 18-03-2013 14:54 от Shakesbeer »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #24 : 18-03-2013 16:10 » |
|
endpoints_count - чему равен после ЭТОГО присвоения?! s_in_fifo_endpoint - блоки кода где происходит проверка и присвоение - вообще выполняется или нет?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #25 : 19-03-2013 09:13 » |
|
endpoints_count - чему равен после ЭТОГО присвоения?! s_in_fifo_endpoint - блоки кода где происходит проверка и присвоение - вообще выполняется или нет?
Я так понял он запрашивает у Cypressa: // get usb IN and OUT FIFOs endpoints int endpoints_count = s_usb_device->EndPointCount();
for (i=1; i<endpoints_count; i++) { CCyUSBEndPoint *endpoint; endpoint = s_usb_device->EndPoints[i]; if (endpoint->Attributes == 2) { // it is a Bulk endpoint if(endpoint->Address == 0x86) { // my IN endpoint s_in_fifo_endpoint = endpoint; } if(endpoint->Address == 0x02) { // my OUT endpoint s_out_fifo_endpoint = endpoint; } } } // get Control enpoint s_control_endpoint = s_usb_device->ControlEndPt; А какую желательно сделать проверку? подскажите плииз) :
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #26 : 19-03-2013 09:46 » |
|
да хоть мессаджбокс! откуда вы знаете, что endpoints_count вообще не вернулся равным нулю, к примеру? и что цикл for (i=1; i<endpoints_count; i++) вообще имел место быть и выполнятся?! что указатели вообще присваивались?!!! вообще у вас принято возвращаемые значения на валидность проверять?! *ругаюсь страшно, и брюзжу*)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #27 : 19-03-2013 10:30 » |
|
да хоть мессаджбокс! откуда вы знаете, что endpoints_count вообще не вернулся равным нулю, к примеру? и что цикл for (i=1; i<endpoints_count; i++) вообще имел место быть и выполнятся?! что указатели вообще присваивались?!!! вообще у вас принято возвращаемые значения на валидность проверять?! *ругаюсь страшно, и брюзжу*)
Вы оказались абсолютно правы, попросту не задан endpoint: usb_init(); char buf[8]; if (s_usb_device->DeviceCount()>0) if (!s_usb_device->IsOpen()) { // Could not open my device if (Application->MessageBox("Could not open my device","Ошибка", MB_OK) != IDOK) return; } else { if (s_in_fifo_endpoint>0) { usb_begin_in_transfer(buf, 8); usb_is_in_transfer_done(); usb_finish_in_transfer(); usb_wait_in_transfer_finish(); usb_close(); } else if (Application->MessageBox("не задан s_in_fifo_endpoint","Ошибка", MB_OK) != IDOK) return; } else if (Application->MessageBox("Could not open my device","Ошибка", MB_OK) != IDOK) return; Как мне исправиться? Endpointы считываю с Cypressa ведь? Нашел ещё один вариант интересный, но никак не разберусь что писать дальше: CCyBulkEndPoint *BulkInEpt = NULL; CCyBulkEndPoint *BulkOutEpt = NULL; CCyUSBDevice *USBDevice = new CCyUSBDevice(NULL); if (USBDevice->DeviceCount()) for (int c=0; c < USBDevice->DeviceCount(); c++) if (USBDevice->Open(c)) { int eptCount = USBDevice->EndPointCount(); for (int i=1; i<eptCount; i++) { bool bIn = ((USBDevice->EndPoints[i]->Address & 0x80)==0x80); bool bBulk = (USBDevice->EndPoints[i]->Attributes == 2); if (bBulk && bIn) BulkInEpt = (CCyBulkEndPoint *) USBDevice->EndPoints[i]; if (bBulk && !bIn) BulkOutEpt = (CCyBulkEndPoint *) USBDevice->EndPoints[i]; } USBDevice->Close(); }
|
|
« Последнее редактирование: 19-03-2013 12:33 от Shakesbeer »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #28 : 19-03-2013 15:43 » |
|
уже почти рыдаю проверяйте почему он не задан в usb_init()
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #29 : 21-03-2013 11:42 » |
|
Просто не понимаю почему в данном случае все параметры EP выводит нормально: CCyUSBDevice *USBDevice; char buf[512]; string s; USB_DEVICE_DESCRIPTOR descr; USBDevice = new CCyUSBDevice(NULL); // Create an instance of CCyUSBDevice GroupBox1->Caption = "device count " + AnsiString(USBDevice->DeviceCount()); if (USBDevice->DeviceCount()) for (int c=0; c < USBDevice->DeviceCount(); c++) { if (USBDevice->Open(c)) { Memo1->Clear(); int vID = USBDevice->VendorID; int pID = USBDevice->ProductID; Label[0]->Caption = "VendorID: " + AnsiString(IntToHex(vID,4)); Label[1]->Caption = "ProductID: " + AnsiString(IntToHex(pID,4)); CCyUSBConfig cfg = USBDevice->GetUSBConfig(c); USBDevice->GetDeviceDescriptor(&descr); for (int i=0; i<cfg.AltInterfaces; i++) { CCyUSBInterface *ifc = cfg.Interfaces[i]; for (int e=0; e<ifc->bNumEndpoints; e++) { CCyUSBEndPoint *ept = ifc->EndPoints[e+1]; Memo1->Lines->Add("EndPoint Descriptor" + AnsiString(e+1) + ":"); Memo1->Lines->Add("----------------------"); Memo1->Lines->Add("bLength 0x" + AnsiString(IntToHex(ept->DscLen, 4))); Memo1->Lines->Add("bDescriptorType 0x" + AnsiString(IntToHex(ept->DscType, 4))); Memo1->Lines->Add("bEndpointAddress 0x" + AnsiString(IntToHex(ept->Address, 4))); Memo1->Lines->Add("bmAttributes 0x" + AnsiString(IntToHex(ept->Attributes, 4))); Memo1->Lines->Add("wMaxPacketSize 0x" + AnsiString(IntToHex(ept->MaxPktSize,4))); Memo1->Lines->Add("bInterval 0x" + AnsiString(IntToHex(ept->Interval, 4))); Memo1->Lines->Add("********************************************************************"); } } } USBDevice->Close(); } Добавлено через 3 минуты и 1 секунду:И если нужно задавать вручную, то в каком виде?
|
|
« Последнее редактирование: 21-03-2013 11:45 от Shakesbeer »
|
Записан
|
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #30 : 22-03-2013 14:19 » |
|
Народ, а не подскажите, почему у меня Bulk Loop не может распознать мою плату ? хотя CyConsole и ControlCenter нормально видят
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #31 : 22-03-2013 15:28 » |
|
xenetron, там прошивка соответствующая лежит в папке проекта.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #32 : 22-03-2013 18:33 » |
|
файл cyusb.lib ?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #33 : 23-03-2013 09:31 » |
|
Ochkarik, *наливает ведро валерянки* ))
|
|
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #34 : 26-03-2013 09:34 » |
|
В статье http://www.efo.ru/cgi-bin/go?2524 имеется описание некоторых функций и файлов. Но вот где достать эти файлы, которые указаны в статье? В CySuiteUSB_3_4_7_B204.exe не все. Например где найти PERIPH.C и DSCR.A51?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #35 : 26-03-2013 12:01 » |
|
Shakesbeer, Cypress\Cypress Suite USB 3.4.4\Firmware\Endpoint_Interrupts\Firmware\Endpoint_Interrupts\periph.c Cypress\Cypress Suite USB 3.4.4\Firmware\Endpoint_Interrupts\Firmware\Endpoint_Interrupts\dscr.a51 не думаю что они могли куда то исчезнуть в следующей версии
Добавлено через 1 минуту и 47 секунд: xenetron, пардон, не увидел последний вопрос. файл прошивки для данного контроллера имеет расширение hex.
Алексей++, спасибо))) помогло))))
|
|
« Последнее редактирование: 26-03-2013 12:02 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #36 : 26-03-2013 13:35 » |
|
Shakesbeer, скажи, а где ты в Firmware нашел такую папку Endpoint...? у меня просто такой нету.
|
|
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #37 : 26-03-2013 13:46 » |
|
В CySuiteUSB_3.4.7 такого нет вообще. Добавлено через 38 секунд:Shakesbeer, скажи, а где ты в Firmware нашел такую папку Endpoint...? у меня просто такой нету.
Я такого не находил, потому и спрашиваю)
|
|
« Последнее редактирование: 26-03-2013 13:46 от Shakesbeer »
|
Записан
|
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #38 : 26-03-2013 13:52 » |
|
Ochkarik, а можешь скинуть мне эти два файла - periph.c и dscr.a51. у меня просто версия программы 3.4.7, наверно забыли положить эти файлы или залили в какие то.
|
|
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #39 : 26-03-2013 13:59 » |
|
Аналогично и я попрошу) Если есть возможность кинь архив с этими файлами
|
|
|
Записан
|
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #40 : 26-03-2013 14:00 » |
|
Shakesbeer, у тебя есть уже какие то наработке для программы обмена данных между контроллером и компом?
|
|
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #41 : 26-03-2013 14:06 » |
|
Shakesbeer, у тебя есть уже какие то наработке для программы обмена данных между контроллером и компом?
Да какие там наработки) Мксимум - определение устройства с его VIDом и PIDом. С Bulkloop и Streamer не разобрался. У меня ещё проблема в том что пишу на C++ Builder 6 Но всегда буду рад каким-либо примерам)
|
|
« Последнее редактирование: 26-03-2013 14:09 от Shakesbeer »
|
Записан
|
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #42 : 26-03-2013 14:11 » |
|
Shakesbeer, я как бы тоже в той же ситуации нахожусь. В принципе как бы мне нужно как на подобе проги bulk или СyControl - передача данных и чтение их. Начал читать исх код Bulk. но что именно конкретно нужно пока не очень понятно.
|
|
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #43 : 26-03-2013 14:15 » |
|
А в какой программе пишем в Buildere или в Visuale?
|
|
|
Записан
|
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #44 : 26-03-2013 14:15 » |
|
Shakesbeer, билдере
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #45 : 26-03-2013 14:15 » |
|
а какие примеры у вас вообще есть? там пол любому должны быть примеры и проекты для контроллера. и вообще забыл а что за железо у вас? демоборда какая то или что?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #46 : 26-03-2013 14:20 » |
|
Ochkarik, у нас нет, это мы хотели бы на них посмотреть и уже что нибудь сворганить. в CyApi документации очень много всего , разных функций описано, не совсем понятно что нужно именно мне. нужно организовать именно интерфейс обмена данными и больше ничего...
Добавлено через 25 секунд: CY7C68013 именно эта микросхема стоит.
|
|
« Последнее редактирование: 26-03-2013 14:20 от xenetron »
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #47 : 26-03-2013 14:23 » |
|
а какие примеры у вас вообще есть? там пол любому должны быть примеры и проекты для контроллера. и вообще забыл а что за железо у вас? демоборда какая то или что?
Кроме http://www.efo.ru/cgi-bin/go?2524 этой статьи я не нашел подробного описания для работы с Cypressoм. Отладочная у меня Atlys(CY7C68013). Для неё нашел что-то вроде лабы на Dejazzer.com и Makestuff.eu там лампочками поморгать можно и проверить их статус.
|
|
|
Записан
|
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #48 : 26-03-2013 14:43 » |
|
что то заглохло всё)))
|
|
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #49 : 26-03-2013 14:47 » |
|
что то заглохло всё)))
Ждем подсказок)
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #50 : 26-03-2013 14:58 » |
|
Ochkarik, да нивапрос! )
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #51 : 26-03-2013 15:00 » |
|
там на сайте примеров кучка, вы их смотрели? http://www.cypress.com/?id=193&rtID=76Добавлено через 14 минут и 48 секунд:так. посмотрел новую, там проект для прерываний отсутствует. ну и фиг с ним) смотрите примеры builk передачи или CyStreamer. для начала подойдет Добавлено через 1 минуту и 17 секунд:дальше. читаем по ссылкам что такое USB и с чем его едят. https://forum.shelek.ru/index.php/topic,14645.msg257887.html#msg257887потом еще раз смотрим документацию от сайпреса.
|
|
« Последнее редактирование: 26-03-2013 15:15 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #52 : 26-03-2013 15:18 » |
|
так. посмотрел новую, там проект для прерываний отсутствует. ну и фиг с ним) смотрите примеры builk передачи или CyStreamer. для начала подойдет
это ты о чем конкретно говорил?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #53 : 26-03-2013 15:29 » |
|
это ты о чем конкретно говорил?
о чтении документации и о файле periph.c в SDK а он вам вообще зачем был нужен?))
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #54 : 26-03-2013 15:33 » |
|
Ochkarik, да там просто автор статьи на сайте ego... говорит что для проекта нужны 4 файла, в том числе и файл прерываний. я в общем посмотрел доки на сайте cypress-а. вообще ничего не понял что нужно. если где то в названии содержалось что либо о bulk, то после открытия файла - ничего полезного в содержимом не нашел...
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #55 : 26-03-2013 20:11 » |
|
xenetron, сути там все основные функции в примерах по одному шаблону построены. возьмите пример builk передачи из SDK - думаю вам будет не приципиально, это как раз пример с передачей данных. не знаю как в новой версии SDK но в предыдущих этот проект был для Keil студии, контроллер usb на С51 ядре собран. далее втыкаете ваше устройство, оно опознается драйвером сайпреса (если в нем прошивки из eeprom по i2c не залито). дальше их утилитой заливаете в контроллер скомпилированный проект, устройство переобноруживается в соответствии с заданными VID-PID. если в inf прописать - тоже встанет драйвер от сайпреса. дальше той же утилитой можно будет почитать пописать/почитать в контроллер по USB - builk передачи. проект довольно простенький, но для его понимания надо знать физику работы USB и доку. у них там есть что то типа программинг гайд (не помню как дословно называлась). там все тоже более менее внятно, если знать что такое USB шина и с чем ее едят. да и надо разобраться с их регистрами контроллера - там их довольно много. все учить не надо, но хотя бы общее назначение надо знать. как-то так)
PS статью глянул. ну собстно там ничего нет... чего нет в документации. просто краткая выжимка. это не избавляет от необходимости читать доку.
|
|
« Последнее редактирование: 26-03-2013 20:17 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #56 : 27-03-2013 11:44 » |
|
У меня основная проблема состоит в том что я работaю на Buildere, а большинство программ написано на Visuale. Есть какие-нибудь примеры на нём? А то при переходе может возникнуть множество проблем...
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #57 : 27-03-2013 13:10 » |
|
Shakesbeer, честно говоря, мне не совсем ясны проблемы которые могут возникнуть) это ж просто компилятор с линкером) ну выкиньте визуализацию, делов то)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #58 : 28-03-2013 14:14 » |
|
Нашел хороший пример, но перевести на Builder пока не смог) using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; using CyUSB;
namespace BulkLoop { public partial class Form1 : Form { CyUSBDevice myDevice = null; // Create a USB device for our application called myDevice USBDeviceList usbDevices = null; // Find all USBDevice objects that represent all USB devices CyBulkEndPoint BulkInEndPt = null; // We need one Bulk IN endpoint CyBulkEndPoint BulkOutEndPt = null; // We need one Bulk OUT endpoint
Thread tXfers; bool bRunning = false;
int value,value1,value2,value3; int byteCount = 0;
long outCount, inCount;
const int XFERSIZE = 512; byte[] outData = new byte[XFERSIZE]; byte[] inData = new byte[XFERSIZE]; //bool bres; // These 2 needed for TransfersThread to update the UI delegate void UpdateUICallback(); UpdateUICallback updateUI; protected override void OnPaint(PaintEventArgs e) { Bitmap bitmap = new Bitmap(80, 60);// может ещё захочешь куда пиксел сунтуть поэтому 10 на 10; for (int i = 0; i < 80; i++) for (int j = 0; j < 60; j++) bitmap.SetPixel(i, j, Color.Black);
e.Graphics.DrawImage(bitmap, new Point(30, 450));
base.OnPaint(e); } public Form1() { InitializeComponent(); // All components of the form are initialized
// Setup the callback routine for updating the UI updateUI = new UpdateUICallback(StatusUpdate); // Setup the callback routine for updating the UI tXfers = new Thread(new ThreadStart(TransfersThread)); tXfers.IsBackground = true; tXfers.Priority = ThreadPriority.Highest; //Create a list of CYUSB devices usbDevices = new USBDeviceList(CyConst.DEVICES_CYUSB); // All devices served by CyUSB.sys is added to the list usbDevices GetDevice(); //This function gets the device with particular VID and PId //and assign EP2 as BulkoutEP, EP6 as BilkInEP
//Adding event handlers for device attachment and device removal usbDevices.DeviceAttached += new EventHandler(usbDevices_DeviceAttached); // Eventhandler assigned to DeviceAttached // to handle the event when a device is attached usbDevices.DeviceRemoved += new EventHandler(usbDevices_DeviceRemoved); // Eventhandler assigned to DeviceRemoved // to handle the event when a device is removed } /* Summary This is the event handler for Device Attachment event. */ public void usbDevices_DeviceAttached(object sender, EventArgs e) // Eventhandler assigned to DeviceAttached { GetDevice(); //This function gets the device with particular VID and PId //and assign EP2 as BulkoutEP, EP6 as BilkInEP }
/* Summary This is the event handler for Device removal event. */ public void usbDevices_DeviceRemoved(object sender, EventArgs e) // Eventhandler assigned to DeviceRemoved { //if (tXfers.IsAlive) //{ // tXfers.Abort(); // tXfers.Join(); // tXfers = null; // MessageBox.Show("thread alive"); //} //BulkInEndPt.Abort(); //BulkOutEndPt.Abort(); myDevice = usbDevices[0x04b4, 0x1004] as CyUSBDevice; // Assign all devices with VID/PID of 0x04B4/0x1004 to myDevice if (myDevice == null) // If myDevice doesnt exist { bRunning = false; StartBtn.Text = "Start"; StartBtn.BackColor = Color.Aquamarine;
//if (tXfers.IsAlive) //{ // tXfers.Abort(); // tXfers.Join(); // tXfers = null; // if (myDevice != null) myDevice.Dispose(); // MessageBox.Show("BulkLoop Device Not connected"); //} label1.Text = "BulkLoop Device Not Connected"; StartBtn.Enabled = false; } }
/* Summary The function gets the device, as the one having VID=04b4 and PID=1004 This will detect only the devices with the above VID,PID combinations */ public void GetDevice() {
myDevice = usbDevices[0x04b4, 0x1004] as CyUSBDevice; // Assign all devices with VID/PID of 0x04B4/0x1004 to myDevice if (myDevice != null) // If myDevice exists { BulkOutEndPt = myDevice.EndPointOf(0x02) as CyBulkEndPoint; //Assign EP2 as BulkOutEP and EP6 as BulkInEP BulkInEndPt = myDevice.EndPointOf(0x86) as CyBulkEndPoint; label1.Text = "Bulkloop Device connected"; StartBtn.Enabled = true; } else label1.Text = "No Bulkloop Device Detected"; }
/* Summary Executes on Start button click */ private void StartBtn_Click(object sender, EventArgs e) { if (!bRunning) { if (ValBox.Text != "") { byte[] byteArray = Encoding.ASCII.GetBytes(ValBox.Text); byteCount = Encoding.ASCII.GetByteCount(ValBox.Text); value = value1 = value2 = value3 = 0;
if(byteCount >= 1) value = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 0, 1), 16); if(byteCount >= 2) value = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 0, 2), 16); if(byteCount >= 3) value1 = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 2, 1), 16); if(byteCount >= 4) value1 = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 2, 2), 16); if(byteCount >= 5) value2 = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 4, 1), 16); if(byteCount >= 6) value2 = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 4, 2), 16); if(byteCount >= 7) value3 = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 6, 1), 16); if(byteCount >= 8) value3 = Convert.ToInt32(Encoding.ASCII.GetString(byteArray, 6, 2), 16); } else //tell user that he need to put correct value. -- open outCount = 0; inCount = 0;
OutdataBox.Text = ""; InDataBox.Text = ""; bRunning = true; StartBtn.Text = "Stop"; StartBtn.BackColor = Color.Pink;
//creates new thread tXfers = new Thread(new ThreadStart(TransfersThread)); tXfers.IsBackground = true; tXfers.Priority = ThreadPriority.Highest; //Starts the new thread tXfers.Start(); } else { //Makes the thread stop and aborts the thread bRunning = false; StartBtn.Text = "Start"; StartBtn.BackColor = Color.Aquamarine;
if (tXfers == null) return;
if (tXfers.IsAlive) { tXfers.Abort(); tXfers.Join(); tXfers = null; } } }
/* Summary Called from TransfersThread().When you click on start button, it will create and start a new thread named 'TransfersThread'. The function outputs the bytes transfered to outData[] buffer. */ private void SetOutputData() { for (int i = 0; i < XFERSIZE; i++) { if((byteCount >= 1) && (i < XFERSIZE)) outData = (byte)value; if((byteCount >= 3) && (++i < XFERSIZE)) outData = (byte)value1; if((byteCount >= 5) && (++i < XFERSIZE)) outData = (byte)value2; if((byteCount >= 7) && (++i < XFERSIZE)) outData = (byte)value3; } } /* Summary This thread is initiated on start button click.Run the thread and executes the transfer and invokes the StatusUpdate to update the UI */
public void TransfersThread() { int xferLen = XFERSIZE;
bool bResult = true;
// Loop stops if either an IN or OUT transfer fails for (; bRunning && bResult; ) { SetOutputData(); //this function sets the bytes in outData to be transferred to OUT EP
xferLen = XFERSIZE; //calls the XferData function for bulk transfer(OUT) in the cyusb.dll bResult = BulkOutEndPt.XferData(ref outData, ref xferLen); outCount += xferLen;
if (bResult) { //calls the XferData function for bulk transfer(IN) in the cyusb.dll bResult = BulkInEndPt.XferData(ref inData, ref xferLen); inCount += xferLen; }
// Call StatusUpdate() in the main thread this.Invoke(updateUI); //bres = bResult; }
bRunning = false;
// Call StatusUpdate() in the main thread this.Invoke(updateUI); } /* Summary This is the call back function for updating the UI(user interface) and is called from TransfersThread. This updates the OutdataBox,InDataBox with the Bytes transferred; and NumBytesOut,NumBytesIn with the number of Bytes transferred. */ public void StatusUpdate() { StringBuilder dataStrOut = new StringBuilder(); StringBuilder dataStrIn = new StringBuilder(); if (bRunning) { for (int i = 0; i < XFERSIZE; i++) { if ((i % 16) == 0) dataStrOut.Append(string.Format("\r\n{0:X4}", i)); dataStrOut.Append(string.Format(" {0:X2}", outData)); } dataStrOut.Append(string.Format("\r\n")); OutdataBox.Text += dataStrOut.ToString(); //This updates the OutdataBox with bytes transferred OUT
for (int i = 0; i < XFERSIZE; i++) { if ((i % 16) == 0) dataStrIn.Append(string.Format("\r\n{0:X4}", i)); dataStrIn.Append(string.Format(" {0:X2}", inData)); } dataStrIn.Append(string.Format("\r\n")); InDataBox.Text += dataStrIn.ToString(); //This updates the InDataBox with bytes transferred IN }
NumBytesOut.Text = outCount.ToString(); //This updates the NumBytesOut with number of bytes transferred OUT NumBytesIn.Text = inCount.ToString(); //This updates the NumBytesIn with number of bytes transferred IN Refresh();
StartBtn.Text = bRunning ? "Stop" : "Start"; StartBtn.BackColor = bRunning ? Color.Pink : Color.Aquamarine;
//Text = bres.ToString();
} /* Summary closing the open form */ private void Form1_FormClosing(object sender, FormClosingEventArgs e) { // If close was selected while running the loopback, shut it down. if (bRunning) StartBtn_Click(this, null);
if (usbDevices != null) usbDevices.Dispose(); }
private void Form1_Load(object sender, EventArgs e) {
} } } Тут ещё появляется небольшая разница в библиотеках CyUSB.dll и CyAPI.lib Поставить вместо USBDevice CyUSBDevice я догадался, но вот USBDeviceList в CyAPI.lib нету, правда сразу нашел описание класса: #region Сборка CyUSB.dll, v2.0.50727 // D:\Programming\CYPRESS_USB\Cypress\AN70983\Bulkloop\Application\Source\BulkLoop\bin\Debug\CyUSB.dll #endregion
using System; using System.Collections; using System.Reflection;
namespace CyUSB { public class USBDeviceList : IDisposable, IEnumerable { public USBDeviceList(byte DeviceMask); public USBDeviceList(byte DeviceMask, App_PnP_Callback fnCallBack);
public int Count { get; }
public USBDevice this[int index] { get; set; } public USBDevice this[string infName] { get; } public USBDevice this[int VID, int PID] { get; } public CyHidDevice this[string sMfg, string sProd] { get; } public CyHidDevice this[int VID, int PID, int UsagePg, int Usage] { get; } public CyHidDevice this[string sMfg, string sProd, int UsagePg, int Usage] { get; }
public event EventHandler DeviceAttached; public event EventHandler DeviceRemoved;
public USBDevice Add(); public byte DeviceIndex(USBDevice dev); public void Dispose(); protected virtual void Dispose(bool isDisposing); public IEnumerator GetEnumerator(); public void Remove(CySafeFileHandle hDev); public void Remove(IntPtr hDev, USBEventArgs e); } } Этого я пока не пробовал, но с другой стороны всегда можно определить устройство банально открывая все USB и сравнивая VID и PID... Аналогичная проблема с Thread: #region Сборка mscorlib.dll, v2.0.50727 // C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll #endregion
using System; using System.Globalization; using System.Runtime.ConstrainedExecution; using System.Runtime.InteropServices; using System.Runtime.Remoting.Contexts; using System.Security.Principal;
namespace System.Threading { // Сводка: // Создает и контролирует поток, задает приоритет и возвращает статус. [ClassInterface(ClassInterfaceType.None)] [ComVisible(true)] [ComDefaultInterface(typeof(_Thread))] public sealed class Thread : CriticalFinalizerObject, _Thread { public Thread(ParameterizedThreadStart start); public Thread(ThreadStart start); public Thread(ParameterizedThreadStart start, int maxStackSize); public Thread(ThreadStart start, int maxStackSize); [Obsolete("The ApartmentState property has been deprecated. Use GetApartmentState, SetApartmentState or TrySetApartmentState instead.", false)] public ApartmentState ApartmentState { get; set; } public static Context CurrentContext { get; } public CultureInfo CurrentCulture { get; set; } public static IPrincipal CurrentPrincipal { get; set; } public static Thread CurrentThread { get; } public CultureInfo CurrentUICulture { get; set; } public ExecutionContext ExecutionContext { get; } public bool IsAlive { get; } public bool IsBackground { get; set; } public bool IsThreadPoolThread { get; } public int ManagedThreadId { get; } public string Name { get; set; } public ThreadPriority Priority { get; set; } public ThreadState ThreadState { get; } public void Abort(); public void Abort(object stateInfo); public static LocalDataStoreSlot AllocateDataSlot(); public static LocalDataStoreSlot AllocateNamedDataSlot(string name); [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] public static void BeginCriticalRegion(); [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] public static void BeginThreadAffinity(); public static void EndCriticalRegion(); public static void EndThreadAffinity(); public static void FreeNamedDataSlot(string name); public ApartmentState GetApartmentState(); [Obsolete("Thread.GetCompressedStack is no longer supported. Please use the System.Threading.CompressedStack class")] public CompressedStack GetCompressedStack(); public static object GetData(LocalDataStoreSlot slot); public static AppDomain GetDomain(); public static int GetDomainID(); [ComVisible(false)] public override int GetHashCode(); public void Interrupt(); public void Join(); public bool Join(int millisecondsTimeout); public bool Join(TimeSpan timeout); public static void MemoryBarrier(); public static void ResetAbort(); System.Security.Permissions.SecurityPermission. [Obsolete("Thread.Resume has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. http://go.microsoft.com/fwlink/?linkid=14202", false)] public void Resume(); public void SetApartmentState(ApartmentState state); [Obsolete("Thread.SetCompressedStack is no longer supported. Please use the System.Threading.CompressedStack class")] public void SetCompressedStack(CompressedStack stack); public static void SetData(LocalDataStoreSlot slot, object data); public static void Sleep(int millisecondsTimeout); public static void Sleep(TimeSpan timeout); [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] public static void SpinWait(int iterations); public void Start(); public void Start(object parameter); System.Security.Permissions.SecurityPermission. [Obsolete("Thread.Suspend has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. http://go.microsoft.com/fwlink/?linkid=14202", false)] public void Suspend(); public bool TrySetApartmentState(ApartmentState state); public static byte VolatileRead(ref byte address); public static double VolatileRead(ref double address); public static float VolatileRead(ref float address); public static int VolatileRead(ref int address); public static IntPtr VolatileRead(ref IntPtr address); public static long VolatileRead(ref long address); public static object VolatileRead(ref object address); [CLSCompliant(false)] public static sbyte VolatileRead(ref sbyte address); public static short VolatileRead(ref short address); [CLSCompliant(false)] public static uint VolatileRead(ref uint address); [CLSCompliant(false)] public static UIntPtr VolatileRead(ref UIntPtr address); [CLSCompliant(false)] public static ulong VolatileRead(ref ulong address); [CLSCompliant(false)] public static ushort VolatileRead(ref ushort address); public static void VolatileWrite(ref byte address, byte value); public static void VolatileWrite(ref double address, double value); public static void VolatileWrite(ref float address, float value); public static void VolatileWrite(ref int address, int value); public static void VolatileWrite(ref IntPtr address, IntPtr value); public static void VolatileWrite(ref long address, long value); public static void VolatileWrite(ref object address, object value); [CLSCompliant(false)] public static void VolatileWrite(ref sbyte address, sbyte value); public static void VolatileWrite(ref short address, short value); [CLSCompliant(false)] public static void VolatileWrite(ref uint address, uint value); [CLSCompliant(false)] public static void VolatileWrite(ref UIntPtr address, UIntPtr value); [CLSCompliant(false)] public static void VolatileWrite(ref ulong address, ulong value); [CLSCompliant(false)] public static void VolatileWrite(ref ushort address, ushort value); } } С этим потоком совсем непонятно, честно говоря. Чем его можно заменить или переправить в Builder? Столкнулся я с другой проблемой - delegate, я так понял тут можно вызывать какую-нибудь функции взамен.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #59 : 28-03-2013 19:19 » |
|
Shakesbeer, Cypress CyAPI Programmer's Reference 1 Overview Library Overview CyAPI.lib provides a simple, powerful C++ programming interface to USB devices. More specifically, it is a C++ class library that provides a high-level programming interface to the CyUsb.sys device driver. The library is only able to communicate with USB devices that are served by (i.e. matched to) this driver. Rather than communicate with the driver via Windows API calls such as SetupDiXxxx and DeviceIoControl, applications call simpler CyAPI methods such as Open, Close, and XferData to communicate with USB devices. To use the library, you need to include the header file, CyAPI.h, in files that access the CCyUSBDevice class. In addition, the statically linked CyAPI.lib file must be linked to your project. Versions of the .lib file are available for use with Microsoft Visual Studio 2008, 2010 and Borland C++ Builder 6.0. Please refer section How to Link to CyAPI.lib for more detail. The library employs a Device and EndPoints use model. To use the library you must create an instance of the CCyUSBDevice class using the new keyword. A CCyUSBDevice object knows how many USB devices are attached to the CyUsb.sys driver and can be made to abstract any one of those devices at a time by using the Open method. An instance of CCyUSBDevice exposes several methods and data members that are device-specific, such as DeviceName, DevClass, VendorID, ProductID, and SetAltIntfc. When a CCyUSBDevice object is open to an attached USB device, its endpoint members provide an interface for peforming data transfers to and from the device's endpoints. Endpoint-specific data members and methods such as MaxPktSize, TimeOut, bIn, Reset and XferData are only accessible through endpoint members of a CCyUSBDevice object. In addition to its simplicity, the class library facilitates creation of sophisticated applications as well. The CCyUSBDevice constructor automatically registers the application for Windows USB Plug and Play event notification. This allows your application to support "hot plugging" of devices. Also, the asynchronous BeginDataXfer/WaitForXfer/FinishDataXfer methods allow queueing of multiple data transfer requests on a single endpoint, thus enabling data streaming from the application level. мне продолжить? или все таки сами начнете читать?)
|
|
« Последнее редактирование: 28-03-2013 19:23 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #60 : 28-03-2013 21:31 » |
|
Я как раз обратил внимание что вначале дока говорится, что типа для простого обмена данными пригодится метод open close и xferdata. щас вот обрабатываю файлы bulkloopdlg, bulkloop, где как бы эти методы используются. но вот проблема. все пилилось на вижуале. и это очень заметно. Потому что вопервых: используется библиотека stdafx.h, вовторых постоянно идет связка с afx* библиотеками, которые идут с MFC. В инете посмотрел, что аналога stdafx в билдере нет. и никак обыграть не получиться. после того, как я комменчу всю инфу, связанную с afx и stdafx, появляется следующая ошибка // BulkLoop.h : main header file for the BULKLOOP application //
#if !defined(AFX_BULKLOOP_H__94303D2D_6EC6_4505_BE2A_85BDF0C7D94F__INCLUDED_) #define AFX_BULKLOOP_H__94303D2D_6EC6_4505_BE2A_85BDF0C7D94F__INCLUDED_
#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000
//#ifndef __AFXWIN_H__ // #error include 'stdafx.h' before including this file for PCH //#endif
#include "resource.h" // main symbols
///////////////////////////////////////////////////////////////////////////// // CBulkLoopApp: // See BulkLoop.cpp for the implementation of this class //
class CBulkLoopApp : public CWinApp { public: CBulkLoopApp();
// Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CBulkLoopApp) public: virtual BOOL InitInstance(); //}}AFX_VIRTUAL
// Implementation
//{{AFX_MSG(CBulkLoopApp) // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG DECLARE_MESSAGE_MAP() };
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_BULKLOOP_H__94303D2D_6EC6_4505_BE2A_85BDF0C7D94F__INCLUDED_) [BCC32 Error] BulkLoop.h(23): E2303 Type name expected [BCC32 Error] BulkLoop.h(23): E2303 Type name expected [BCC32 Error] BulkLoop.h(31): E2462 'virtual' can only be used with non-template member functions [BCC32 Error] BulkLoop.h(31): E2303 Type name expected [BCC32 Error] BulkLoop.h(31): E2139 Declaration missing ; [BCC32 Error] BulkLoop.h(41): E2040 Declaration terminated incorrectly [BCC32 Error] BulkLoopDlg.h(17): E2303 Type name expected [BCC32 Error] BulkLoopDlg.h(20): E2293 ) expected [BCC32 Error] BulkLoopDlg.h(23): E2303 Type name expected [BCC32 Error] BulkLoopDlg.h(23): E2139 Declaration missing ; и в общем теперь билдер просто помоему начал капризничать? или я может немного не понимаю, что именно не так объявлено. с объявлением класса вроде все норм. подскажите если знаете.
|
|
« Последнее редактирование: 28-03-2013 21:35 от xenetron »
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #61 : 29-03-2013 10:28 » |
|
Что касается CyАpi меня вопрос только в объявлении параметров Сypressa, его EP и т.д. Добавлено через 3 часа, 22 минуты и 8 секунд:xenetron, у меня та же фигня была. Из-за чего готовые примеры Cypressa рассматривать в Билдере было невозможно.
|
|
« Последнее редактирование: 29-03-2013 13:50 от Shakesbeer »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #62 : 29-03-2013 19:46 » |
|
да погодите. ну не надо-ж так целиком без разбора драть все подряд! нафига вам визуализация из студии? пишите свою. и еще раз - посмотрите что, как и главное зачем вызывается перед тем как тупо драть код. примеры нужны для этого а не для тупого копипаста. а stdafx вам вообще не нужен, и если бы вы сначала разобрались что вы копируете - вы бы это поняли.
все. дискуссию закрываю. в дальнейшем, подобного рода вопросы, простите, буду отправлять в помойку.
|
|
« Последнее редактирование: 29-03-2013 19:49 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #63 : 01-04-2013 13:56 » |
|
Shakesbeer, можешь попробовать поработать с проектом FxEEPROM. Он как раз под билдер сделан. Ochkarik, такая вот проблема, я подгрузил все файлы FxEEPROM в проект билдера, и вылезает такая ошибка файлы проекта и фото ошибки прилагаются. http://zalil.ru/34401540
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #64 : 01-04-2013 15:48 » |
|
xenetron
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #65 : 01-04-2013 17:02 » |
|
что в этот раз не так?
|
|
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #66 : 12-04-2013 11:00 » |
|
Не могу разобраться какие параметры надо задавать для bulk передачи. Если кто-нибудь знает ресурс или статьи, где обсуждается это скиньте плииз) P.S. Пишу на C++ Builder. Добавлено через 6 дней, 3 часа, 45 минут и 42 секунды:Использую Bulk передачу и прием. В случае единичной передачи все проходит хорошо, без ошибок, посылает пакет, принимает: void __fastcall TForm1::Button4Click(TObject *Sender) { USBDevice = new CCyUSBDevice(NULL); OVERLAPPED outOvLap, inOvLap; outOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_OUT"); //unsigned char buffer[128] = "1s";//(unsigned char*)Form1->Edit1->Text.c_str(); //LONG length = 128; AnsiString stryng = Form1->Edit1->Text.c_str(); char* buffer=new char[stryng.Length()+1]; strcpy(buffer,stryng.c_str()); LONG length = stryng.Length()+1; UCHAR *outContext = USBDevice->BulkOutEndPt->BeginDataXfer(buffer, length, &outOvLap); USBDevice->BulkOutEndPt->WaitForXfer(&outOvLap,100); USBDevice->BulkOutEndPt->FinishDataXfer(buffer, length, &outOvLap,outContext); CloseHandle(outOvLap.hEvent); unsigned char inBuf[128]; ZeroMemory(inBuf, 128); inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN"); UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inBuf, length, &inOvLap); USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100); USBDevice->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext); CloseHandle(inOvLap.hEvent); Memo2->Lines->Add(AnsiString((char *)inBuf)); } Создал поток передачи и приема, при нажатии на SpeedButton начинаются передача и прием, при повторном нажатии прекращаются. Описание thread приема и передачи: CCyUSBDevice *USBDevice; OVERLAPPED outOvLap, inOvLap; char* buffer; unsigned char inBuf[512]; LONG length;
//--------------------------------------------------------------------------- //----------------------Reading---------------------------------------------- //--------------------------------------------------------------------------- class ReadThread : public TThread { private: void __fastcall Printing(); protected: void __fastcall Execute(); public: __fastcall ReadThread(bool CreateSuspended); }; //--------------------------------------------------------------------------- ReadThread *reader; //îáúåêò ïîòîêà ReadThread //--------------------------------------------------------------------------- __fastcall ReadThread::ReadThread(bool CreateSuspended) : TThread(CreateSuspended) {} //--------------------------------------------------------------------------- void __fastcall ReadThread::Execute() { inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN"); while(!Terminated) { UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inBuf, length, &inOvLap); USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100); USBDevice->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext); Synchronize(Printing); } CloseHandle(inOvLap.hEvent); } //--------------------------------------------------------------------------- void __fastcall ReadThread::Printing() { Form1->Label2->Caption = Form1->Label2->Caption.ToInt() + strlen(inBuf); Form1->Memo2->Lines->Add(AnsiString((char *)inBuf)); ZeroMemory(inBuf, 512); } //--------------------------------------------------------------------------- //----------------------Writing---------------------------------------------- //--------------------------------------------------------------------------- class WriteThread : public TThread { private: void __fastcall Printing(); protected: void __fastcall Execute(); public: __fastcall WriteThread(bool CreateSuspended); }; //----------------------------------------------------------------------------- //............................ WriteThead ............................... //-----------------------------------------------------------------------------
WriteThread *writer; //îáúåêò ïîòîêà WriteThread
//--------------------------------------------------------------------------- __fastcall WriteThread::WriteThread(bool CreateSuspended) : TThread(CreateSuspended) {} //--------------------------------------------------------------------------- void __fastcall WriteThread::Execute() { AnsiString stryng = Form1->Edit1->Text.c_str(); buffer=new char[stryng.Length()+1] strcpy(buffer,stryng.c_str()); length = stryng.Length()+1; //length = strlen(buffer); outOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_OUT"); UCHAR *outContext; while(!Terminated) { outContext = USBDevice->BulkOutEndPt->BeginDataXfer(buffer, length, &outOvLap); USBDevice->BulkOutEndPt->WaitForXfer(&outOvLap,100); USBDevice->BulkOutEndPt->FinishDataXfer(buffer, length, &outOvLap,outContext); } CloseHandle(outOvLap.hEvent); } //--------------------------------------------------------------------------- void __fastcall WriteThread::Printing() // Stop sending data { } //--------------------------------------------------------------------------- Сама кнопка SpeedButton: void __fastcall TForm1::SpeedButton1Click(TObject *Sender) { USBDevice = new CCyUSBDevice(NULL); if (SpeedButton1->Down) { Form1->Label2->Caption = "0"; SpeedButton1->Caption = "Stop transfer"; writer = new WriteThread(false); writer->FreeOnTerminate = true; reader = new ReadThread(false); reader->FreeOnTerminate = true; } else { SpeedButton1->Caption = "Begin transfer"; if(writer)writer->Terminate(); if(reader)reader->Terminate(); CloseHandle(outOvLap.hEvent); CloseHandle(inOvLap.hEvent); } } Некорректно завершается передача и прием при остановке потока, периодически возникают ошибка во время передачи. Что не так сделал, объясните, плииз)
|
|
« Последнее редактирование: 18-04-2013 14:46 от Shakesbeer »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #67 : 18-04-2013 15:37 » |
|
сто раз уже говорил. ну сколько можно то! где проверки статусов? ошибка - какая ошибка? некорректно - в чем это "некорректно"?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #68 : 19-04-2013 09:08 » |
|
сто раз уже говорил. ну сколько можно то! где проверки статусов? ошибка - какая ошибка? некорректно - в чем это "некорректно"?
Каких статусов? Endpoit задается корректно. Надо проверять статус каждый раз в потоке? По поводу ошибки не точно выразился. При вторичном нажатии кнопки прием-передача должна быть остановлена, но процесс не останавливается, либо начинает принимать пустые байты.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #69 : 19-04-2013 09:25 » |
|
while(!Terminated) Terminated - это что за переменная? и где оно выставляется if(writer)writer->Terminate(); - что эта функция делает? нить убивает? а в какой момент? сайпрес - засланцы. описание функции у них все таки безобразное... назначение поля OVERLAPPED в этих функциях?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #70 : 19-04-2013 10:36 » |
|
while(!Terminated) Terminated - это что за переменная? и где оно выставляется if(writer)writer->Terminate(); - что эта функция делает? нить убивает? а в какой момент? сайпрес - засланцы. описание функции у них все таки безобразное... назначение поля OVERLAPPED в этих функциях?
if(writer)writer->Terminate(); - это как раз прекращение потока, т.е. Terminated присваивается true, соответственно while(!Terminated) прекращает цикл. Это я взял из своей старой программы работы с COM портом, там было все без проблем и прекрасно работало. А пример передачи через CCyUSBDevice с OVERLAPPED и т.д. просто скопировал с примера Bulk из CyAPI. Добавлено через 19 минут и 19 секунд:Сделал такую защиту в потоке: void __fastcall ReadThread::Execute() { while(!Terminated) { inOvLap.hEvent = CreateEvent(NULL, false, false, "CYUSB_IN"); UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inBuf, length, &inOvLap); USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100); succesIn = USBDevice->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext); if((!succesIn) || (!succesOut)) //Если прием или передача с ошибкой произошли { reader->Terminate(); //Прекращаем поток приема Form1->SpeedButton1->Caption = "Begin transfer"; Form1->SpeedButton1->Down = false; } Synchronize(Printing); CloseHandle(inOvLap.hEvent); } } Но все равно происходят сбои, я так понимаю что это просто потому что одновременно работают два потока: один записывает, а другой считывает. Для такой работы наверное стоит соединить их в один thread) У меня появился вопрос по поводу другого принципа из CyAPI: USBDevice = new CCyUSBDevice(NULL); CCyControlEndPoint *eptOut = USBDevice->ControlEndPt; AnsiString stryng = Form1->Edit1->Text.c_str(); //char* bufOut1=new char[stryng.Length()+1];//length возвращает длинну без нуль-терминатора,поэтому +1
eptOut->Target = TGT_DEVICE; eptOut->ReqType = REQ_VENDOR; eptOut->Direction = DIR_TO_DEVICE; eptOut->ReqCode = 0x05; eptOut->Value = 1; eptOut->Index = 0; unsigned char bufOut[512]; ZeroMemory(bufOut, 512); LONG bufOutlen = 512; // LONG bufOutlen = stryng.Length()+1; strcpy(bufOut,stryng.c_str()); bool resSent = eptOut->XferData(bufOut, bufOutlen); if (resSent) Memo2->Lines->Add("Sending Ok"); else Memo2->Lines->Add("Sending failed");
CCyControlEndPoint *eptIn = USBDevice->ControlEndPt; eptIn->Target = TGT_DEVICE; eptIn->ReqType = REQ_VENDOR; eptOut->Direction = DIR_FROM_DEVICE; eptIn->ReqCode = 0x07; eptIn->Value = 1; eptIn->Index = 0; unsigned char bufIn[512]; LONG bytesToRead = bufOutlen; bool resRes = eptIn->Read(bufIn, bytesToRead); if (resRes) Memo2->Lines->Add("Recieving Ok"); else Memo2->Lines->Add("Recieving failed"); Memo2->Lines->Add(AnsiString((char *)bufIn)); Никак не разберусь какая величина ept указывает на номер Enpointa, на который будут передаваться или с которого будут считываться данные.
|
|
« Последнее редактирование: 19-04-2013 10:56 от Shakesbeer »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #71 : 19-04-2013 12:32 » |
|
конечная точка типа Control. номер видимо либо eptIn->Value = 1 или eptIn->Index = 0; Добавлено через 3 минуты и 50 секунд:Но все равно происходят сбои, я так понимаю что это просто потому что одновременно работают два потока: один записывает, а другой считывает. Для такой работы наверное стоит соединить их в один thread)" не вижу препятствий для одновременной работы двух нитей... если только интерфейс библиотеки сайпреса не позволяет. а функция терминации меня все равно смущает. хрень какая то) если в нити не проверять эту переменную - нить никогда не остановится что ли?
|
|
« Последнее редактирование: 19-04-2013 12:36 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #72 : 19-04-2013 12:47 » |
|
не вижу препятствий для одновременной работы двух нитей... если только интерфейс библиотеки сайпреса не позволяет. а функция терминации меня все равно смущает. хрень какая то) если в нити не проверять эту переменную - нить никогда не остановится что ли?
Смысл terminate в прекращении ReadThread или WriteThread. Вот только почему-то после прекращения потока, работа системы с микросхемой продолжается до тех пор, пока не отсоединишь устройство. Добавлено через 4 минуты и 41 секунду:Я исправил ошибку, объединив два потока в один. Похоже они просто накладывались друг на друга
|
|
« Последнее редактирование: 19-04-2013 13:12 от Shakesbeer »
|
Записан
|
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #73 : 19-04-2013 13:15 » |
|
Shakesbeer, твоя прога ж работает только на I/O?
|
|
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #74 : 19-04-2013 13:27 » |
|
Shakesbeer, твоя прога ж работает только на I/O?
Не понял вопроса. Вот программа, там сделал три потока: на чтение из USb порта, на запись и на последовательные запись и чтение. прописываешь Bulkloop.hex с помощью ControlCenter и юзаешь. Надеюсь поможет
|
|
|
Записан
|
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #75 : 19-04-2013 13:36 » |
|
Shakesbeer, у меня выскачила вот такая ошибка - [BCC32 Error] Unit1.cpp(304): E2285 Could not find a match for 'CCyUSBConfig::CCyUSBConfig(const CCyUSBConfig&)' CCyUSBConfig cfg = USBDevice->GetUSBConfig(c); в 304 строчке и при build-е спрашивает где находится package dss.bpi
|
|
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #76 : 19-04-2013 13:43 » |
|
Shakesbeer, у меня выскачила вот такая ошибка - [BCC32 Error] Unit1.cpp(304): E2285 Could not find a match for 'CCyUSBConfig::CCyUSBConfig(const CCyUSBConfig&)' CCyUSBConfig cfg = USBDevice->GetUSBConfig(c); в 304 строчке и при build-е спрашивает где находится package dss.bpi Я использую Borland C++ Builder 6 и соответственно кипресовскую библиотеку CyApi.lib, которую брал из папки USB Suite->lib->BC6. Если используешь другую программу, то может и библиотеку стоит прикрепить другую? При переходе с одной программы на другую возникает множество проблем с библиотеками, попробуй поискать ответы в интернете о несовместимости.
|
|
|
Записан
|
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #77 : 19-04-2013 13:48 » |
|
Shakesbeer, странно. я тоже пользуюсь 6 билдером. посмотрел в дереве - и CyApi.h и *.Lib подкл
|
|
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #78 : 19-04-2013 13:52 » |
|
Shakesbeer, странно. я тоже пользуюсь 6 билдером. посмотрел в дереве - и CyApi.h и *.Lib подкл
В System кидал библиотеки usb100.h usb200.h и т.д.?
|
|
|
Записан
|
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #79 : 19-04-2013 13:57 » |
|
Shakesbeer, Shakesbeer, странно. я тоже пользуюсь 6 билдером. посмотрел в дереве - и CyApi.h и *.Lib подкл
В System кидал библиотеки usb100.h usb200.h и т.д.? в систем в смысле в виндовскую папку? Добавлено через 32 минуты и 34 секунды:Shakesbeer, c этой ошибкой я разобрался. но теперь он от меня требует dss.bpi Добавлено через 6 минут и 52 секунды:Shakesbeer, все, я разобрался)
|
|
« Последнее редактирование: 19-04-2013 14:37 от xenetron »
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #80 : 19-04-2013 14:40 » |
|
Shakesbeer, все, я разобрался)
Красавчик!
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #81 : 19-04-2013 15:01 » |
|
после завершения нити, попробуйте на всякий пожарный проверить статус завершения нити. WaitForXfer(&inOvLap,100); - 100 - это время ожидания? пакеты гарантированно доставляются за это время? можно ли вызывать FinishDataXfer() если ожидание завершилось по таймауту?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #82 : 20-04-2013 13:43 » |
|
после завершения нити, попробуйте на всякий пожарный проверить статус завершения нити. WaitForXfer(&inOvLap,100); - 100 - это время ожидания? пакеты гарантированно доставляются за это время? можно ли вызывать FinishDataXfer() если ожидание завершилось по таймауту?
Специально ввел проверку succesIn = USBDevice->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext); //Заканчиваем Bulk прием (прием пакета) if(!succesIn) //Если прием или передача с ошибкой произошли { writereader->Terminate(); //Прекращаем поток передачи-приема Form1->SpeedButton1->Caption = "Begin transfer"; Form1->SpeedButton1->Down = false; }
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #83 : 21-04-2013 00:49 » |
|
Shakesbeer, пардон, на предыдущую версию кода видимо посмотрел. там есть какие нибудь функции статус последней операции EP посмотреть? при передаче по USB транзакция может быть завершена с ошибкой, в этом случае там надо ресет EndPoint-a делать. правда возможно это драйвер сайпреса автоматом делает - не знаю. у меня полные затыки были когда аппаратно поток не правильно был сформирован.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #84 : 23-04-2013 08:47 » |
|
Shakesbeer, сможешь скинуть конфигурацию твоего builder'a? не могу понять почему твоя и некоторые другие программы нехотят полностью компилироваться
|
|
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #85 : 23-04-2013 09:02 » |
|
Использую Bulk передачи, получается около 1 Мбит/с. Писали что с CyAPI легко сделать 48, как достичь такой скорости?
|
|
|
Записан
|
|
|
|
xenetron
Интересующийся
Offline
|
|
« Ответ #86 : 23-04-2013 13:30 » |
|
Shakesbeer, а зачем тебе в проге нужен TImage??
|
|
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #87 : 23-04-2013 13:49 » |
|
xenetron, потому что принятые байты вывожу на экран в виде изображения, где 1 байт равен цвету одного пиксела.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #88 : 23-04-2013 14:40 » |
|
Использую Bulk передачи, получается около 1 Мбит/с. Писали что с CyAPI легко сделать 48, как достичь такой скорости?
48 не видел. на форуме на сайпреса пишут, что приложение на основе streamer(или как там его) с соответствующей прошивкой дает если не путаю порядка 40.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #89 : 23-04-2013 14:40 » |
|
Ochkarik, Похоже надо что-то делать с reset, потому что ошибка периодически выскакивает и поток тормозится. В CyApI написано что нужно использовать Abort вместо Reset. Я так понимаю что Abort возвращает в начальное состояние Endpoint, после чего поток можно сразу же продолжать?
|
|
|
Записан
|
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #90 : 23-04-2013 14:42 » |
|
Ochkarik, а какие методы использует Streamer?)) Я так понял там синхронный ControlEndpoint с XferData просто? Или что-то другое?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #91 : 23-04-2013 15:08 » |
|
не знаю. по спецификации usb в случае возникновения ошибок передачи пакетов надо отменить все транзакции и выполнить сброс EP. если не помогает сброс устройства. как у сайпреса - не знаю. по идее они сами должны были разруливать ситуации. да, и такая штука может происходить, если некорректная программа в контроллере или некорректные аппаратные веревки на входе FIFO сайпреса.
Добавлено через 1 минуту и 5 секунд: Shakesbeer, ну откуда ж я знаю.. я туда не смотрел)))
|
|
« Последнее редактирование: 23-04-2013 15:09 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Shakesbeer
Постоялец
Offline
|
|
« Ответ #92 : 24-04-2013 16:22 » |
|
Ochkarik, проблема все в том же) Думаю написать через простой ControlEndpoint Xferdata и сравнить с Bulk передачей, но не могу найти подробное описание: eptOut->Target = TGT_DEVICE; eptOut->ReqType = REQ_VENDOR; eptOut->Direction = DIR_TO_DEVICE; eptOut->ReqCode = 0x05; eptOut->Value = 1; eptOut->Index = 0;
|
|
|
Записан
|
|
|
|
|