Перейти к содержанию

Преобразование типов


Рекомендуемые сообщения

Столкнулся с проблемой.

Нада из AnsiString s преобразовать в массив чаров.

Вот кусок кода, действует только для одного символа


{ AnsiString s=Edit1->Text;
char * b1 = new char[s.Length()];
strcpy(b1,s.c_str());
pdata.b1=*b1;
hid.SendData(&pdata);
}

Мне нужно всю Ансистринг строку перевести в чар. Не потеряв ни одлного символа. Какие предложения?

Ссылка на комментарий

напиши лучше что за функция такая - SendData и что за параметр она принимает.

В твоем коде ты скопировал в b1 строку. Но не сделал ее null-terminated (что возможно и не нужно, в зависимости от того в каком виде тебе нужна строка).

Передался только один символ потому что pdata.b1 = *b1 это и есть копирование первого символа.

Кроме того у тебя память утекает здесь.

Ссылка на комментарий

Она засылает структуру.


{ 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] 

Ссылка на комментарий

Кстати сейчас заметил в твоем коде еще есть запись за пределы выделенной памяти в копировании строки. Вот здесь:

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.

Ссылка на комментарий

  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 

Эт софт девайса

Ссылка на комментарий
ПРоблема такая что передается только первый символ. Воюю уже с ним второй день.

Первый символ потому что вот эта строка у тебя:

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)

Ссылка на комментарий
Может все таки удастся разбить ансистирнг на чары

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;

или нет?

Ссылка на комментарий

нашел решение.


{
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() приписать

Ссылка на комментарий

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...