D3V3L0p3R Опубликовано 3 июня, 2011 Жалоба Поделиться Опубликовано 3 июня, 2011 Столкнулся с проблемой.Нада из AnsiString s преобразовать в массив чаров.Вот кусок кода, действует только для одного символа{ AnsiString s=Edit1->Text; char * b1 = new char[s.Length()]; strcpy(b1,s.c_str()); pdata.b1=*b1; hid.SendData(&pdata);}Мне нужно всю Ансистринг строку перевести в чар. Не потеряв ни одлного символа. Какие предложения? Ссылка на комментарий
superman Опубликовано 3 июня, 2011 Жалоба Поделиться Опубликовано 3 июня, 2011 напиши лучше что за функция такая - SendData и что за параметр она принимает.В твоем коде ты скопировал в b1 строку. Но не сделал ее null-terminated (что возможно и не нужно, в зависимости от того в каком виде тебе нужна строка).Передался только один символ потому что pdata.b1 = *b1 это и есть копирование первого символа.Кроме того у тебя память утекает здесь. Ссылка на комментарий
D3V3L0p3R Опубликовано 3 июня, 2011 Автор Жалоба Поделиться Опубликовано 3 июня, 2011 Она засылает структуру.{ uchar b1;};struct dataexchange_t pdata;struct dataexchange_tДля общение с хид девайсами.мне нада привести к видуstruct dataexchange_t{ uchar b1[n];};struct dataexchange_t pdata;Ну можно и к другому виду. Главное чтобы заслать массив чаровuchar не 8 битов длиной.Добавлено спустя 5 минут 54 секунды:Нельзя что нибудь на подобие этого ?uchar ch[i]=AnsiString s[i] Ссылка на комментарий
superman Опубликовано 3 июня, 2011 Жалоба Поделиться Опубликовано 3 июня, 2011 Кстати сейчас заметил в твоем коде еще есть запись за пределы выделенной памяти в копировании строки. Вот здесь:char * b1 = new char[s.Length()]; // выделяешь памяти ровно под количество символов в строкеstrcpy(b1,s.c_str()); // копируешь. Но так как strcpy еще попытается записать 0 в конец, вылезет за пределы выделенного куска памяти.В общем если тебе нужен просто массив uchar то можешь так попробовать:uchar* b1 = new uchar[s.Length() / sizeof(uchar) + 1];memcpy(b1, c.c_str(), s.Length());используешь b1 (передаешь в SendData и т.п.), после чегоdelete [] b1. Ссылка на комментарий
D3V3L0p3R Опубликовано 3 июня, 2011 Автор Жалоба Поделиться Опубликовано 3 июня, 2011 if ( 1 == connect() ) { AnsiString s=Edit1->Text; char *b1 = new char[s.Length()/sizeof(uchar)+1]; memcpy(b1,s.c_str(),s.Length()); pdata.b1=*b1; hid.SendData(&pdata); Memo2->Lines->Add(b1); Memo2->Lines->Add(pdata.b1); delete [] b1; // Îòïðàâëÿåì äàííûå óñòðîéñòâóПРоблема такая что передается только первый символ. Воюю уже с ним второй день.Данная прога общается с наклепаным мною девайсом. На том конце тип указан uchar, ну а для девайся учар это строго 8 бит.Добавлено спустя 3 минуты 30 секунд:#include #include #include /* íóæíî äëÿ usbdrv.h */#include "usbdrv.h"struct dataexchange_t // Îïèñàíèå ñòðóêòóðû äëÿ ïåðåäà÷è äàííûõ{ int b1;}pdata;int b2;int c;PROGMEM char usbHidReportDescriptor[22] = { // USB report descriptor // Äåñêðèïòîð îïèñûâàåò ñòðóêòóðó ïàêåòà äàííûõ äëÿ îáìåíà 0x06, 0x00, 0xff, // USAGE_PAGE (Generic Desktop) 0x09, 0x01, // USAGE (Vendor Usage 1) 0xa1, 0x01, // COLLECTION (Application) 0x15, 0x00, // LOGICAL_MINIMUM (0) // min. çíà÷åíèå äëÿ äàííûõ 0x26, 0xff, 0x00, // LOGICAL_MAXIMUM (1024) // max. çíà÷åíèå äëÿ äàííûõ, 255 òóò íå ñëó÷àéíî, à ÷òîáû óëîæèòüñÿ â 1 áàéò 0x75, 0x08, // REPORT_SIZE (8) // èíôîðìàöèÿ ïåðåäàåòñÿ ïîðöèÿìè, ýòî ðàçìåð îäíîãî "ðåïîðòà" 8 áèò 0x95, sizeof(struct dataexchange_t), // REPORT_COUNT // êîëè÷åñòâî ïîðöèé (ó íàøåì ïðèìåðå = 3, îïèñàííàÿ âûøå ñòðóêòóðà ïåðåäàñòñÿ çà òðè ðåïîðòà) 0x09, 0x00, // USAGE (Undefined) 0xb2, 0x02, 0x01, // FEATURE (Data,Var,Abs,Buf) 0xc0 // END_COLLECTION};/* Çäåñü ìû îïèñàëè òîëüêî îäèí report, èç-çà ÷åãî íå íóæíî èñïîëüçîâàòü report-ID (îí äîëæåí áûòü ïåðâûì áàéòîì). * Ñ åãî ïîìîùüþ ïåðåäàäèì 3 áàéòà äàííûõ (ðàçìåð îäíîãî REPORT_SIZE = 8 áèò = 1 áàéò, èõ êîëè÷åñòâî REPORT_COUNT = 3). *//* Ýòè ïåðåìåííûå õðàíÿò ñòàòóñ òåêóùåé ïåðåäà÷è */static uchar currentAddress;static uchar bytesRemaining;void readdata(){//b2=pdata.b1;pdata.b1=b2;}void writedata(){b2=pdata.b1;} // ýòà ôóíêöèÿ áóäåò âûçâàíà, ïîñëå òîãî, êàê êîìïüþòåð çàïèøåò äàííûåstruct dataexchange_t pdata; // à ýòî ñàìè äàííûå/* usbFunctionRead() âûçûâàåòñÿ, êîãäà USB õî÷åò ïðî÷èòàòü ÷àñòü äàííûõ */uchar usbFunctionRead(uchar *data, uchar len){ uint8_t i; if(len > bytesRemaining) len = bytesRemaining; uchar *buffer=(uchar*)&pdata; if(!currentAddress) /* íè îäèí êóñîê äàííûõ åùå íå ïðî÷èòàí */ { readdata(); } for(i=0;i < len;i++) data[i]=buffer[i+currentAddress]; currentAddress += len; bytesRemaining -= len; return len;}/* usbFunctionWrite() âûçûâàåòñÿ êîãäà õîñò îòïðàâëÿåò ïîðöèþ äàííûõ ê óñòðîéñòâó * Äëÿ äîïîëíèòåëüíîé èíôîðìàöèè ñì. äîêóìåíòàöèþ â usbdrv.h *//* usbFunctionRead() âûçûâàåòñÿ, êîãäà USB õî÷åò çàïèñàòü ÷àñòü äàííûõ */uchar usbFunctionWrite(uchar *data, uchar len){ uint8_t i; if(bytesRemaining == 0) return 1; /* êîíåö ïåðåäà÷è */ if(len > bytesRemaining) len = bytesRemaining; uchar *buffer=(uchar*)&pdata; for(i=0;i < len;i++) buffer[i+currentAddress]=data[i]; currentAddress += len; bytesRemaining -= len; if(bytesRemaining == 0) /* âñå äàííûå ïîëó÷åíû */ { writedata(); } return bytesRemaining == 0; /* 0 îçíà÷àåò, ÷òî åñòü åùå äàííûå */}/* ------------------------------------------------------------------------- */usbMsgLen_t usbFunctionSetup(uchar data[8]){usbRequest_t *rq = (void *)data; if((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS){ /* HID óñòðîéñòâî */ if(rq->bRequest == USBRQ_HID_GET_REPORT){ bytesRemaining = sizeof(struct dataexchange_t); currentAddress = 0; return USB_NO_MSG; }else if(rq->bRequest == USBRQ_HID_SET_REPORT){ bytesRemaining = sizeof(struct dataexchange_t); currentAddress = 0; return USB_NO_MSG; } }else{ /* îñòàëüíûå çàïðîñû ìû ïðîñòî èãíîðèðóåì */ } return 0;}int main(void){ usbInit(); usbDeviceDisconnect(); // ïðèíóäèòåëüíî îòêëþ÷àåìñÿ îò õîñòà, òàê äåëàòü ìîæíî òîëüêî ïðè âûêëþ÷åííûõ ïðåðûâàíèÿõ! uchar i = 0; while(--i){ // ïàóçà > 250 ms _delay_ms(1); } usbDeviceConnect(); // ïîäêëþ÷àåìñÿ sei(); // ðàçðåøàåì ïðåðûâàíèÿ for(;{ // ãëàâíûé öèêë ïðîãðàììû usbPoll(); // ýòó ôóíêöèþ íàäî ðåãóëÿðíî âûçûâàòü ñ ãëàâíîãî öèêëà, ìàêñèìàëüíàÿ çàäåðæêà ìåæäó âûçîâàìè - 50 ms } return 0;}/* ------------------------------------------------------------------------- */#include Эт софт девайса Ссылка на комментарий
superman Опубликовано 3 июня, 2011 Жалоба Поделиться Опубликовано 3 июня, 2011 ПРоблема такая что передается только первый символ. Воюю уже с ним второй день.Первый символ потому что вот эта строка у тебя:pdata.b1=*b1;это копирование только первого символа.Если строку надо просто передать в функциюuchar usbFunctionWrite(uchar *data, uchar len)то делается это так на твоем примере:AnsiString s = Edit1->Text;char *b1 = new char[s.Length()/sizeof(uchar)+1];memcpy(b1,s.c_str(),s.Length());usbFunctionWrite(b1, s.Length()); // хотя len надо по другому вычислять если sizeof(char) != sizeof(твой uchar) Ссылка на комментарий
D3V3L0p3R Опубликовано 3 июня, 2011 Автор Жалоба Поделиться Опубликовано 3 июня, 2011 Эт код на микроконтролере, т.е. он вне компа.Может все таки удастся разбить ансистирнг на чары Ссылка на комментарий
superman Опубликовано 4 июня, 2011 Жалоба Поделиться Опубликовано 4 июня, 2011 Может все таки удастся разбить ансистирнг на чарыAnsiString -> char[] не проблема. Тут вопрос в том, как ты передать должен в функцию SendData целую строку если вот эта вот структура, которую ты передаешь:struct dataexchange_t{ int b1;}pdata;имеет только 1 поле int.Можно конечно цикл сделать. Например так:AnsiString s = Edit1->Text;for(int i = 0, num = s.getLength(); i < num; i++){ pdata.b1 = s; hid.SendData(&pdata);}но это туповато выглядит.Я не понял, ты эту структуру можешь сам поменять наstruct dataexchange_t{ uchar b1[n];};struct dataexchange_t pdata;или нет? Ссылка на комментарий
D3V3L0p3R Опубликовано 4 июня, 2011 Автор Жалоба Поделиться Опубликовано 4 июня, 2011 Структуру могу менять как угодно. Переменую инт загнал для тестов, можно поставить char[].Сегодня поробую Ссылка на комментарий
D3V3L0p3R Опубликовано 4 июня, 2011 Автор Жалоба Поделиться Опубликовано 4 июня, 2011 нашел решение. { char stroka1[128]; char stroka2[30]; };{ struct dataexchange_t pdataж sprintf(pdata.stroka1, «Hello world!»); sprintf(pdata.stroka2, «кирилица»);}struct dataexchange_tДобавлено спустя 27 минут 58 секунд:к s забыл c_str() приписать Ссылка на комментарий
Рекомендуемые сообщения
Пожалуйста, войдите, чтобы комментировать
Вы сможете оставить комментарий после входа в
Войти