By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
455,128 Members | 1,224 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 455,128 IT Pros & Developers. It's quick & easy.

Multiple looping

P: n/a

Hello,

I am trying to send 2^19 data to USB2.0. I am reading the file
"all_sines" and loading it into
an array called "string1". Then, in a for loop I copied it into the USB
data array "Data_outBuffer". The USB can
carry only "32767" bytes at one time. The way I am doing right now
requires 16 for loops to send the
2^19 amount of data. ( 32767 * 16 = 2^19). My USB function SetSignals
can only carry "32767 bytes at one time".

I am looking for optimize code solution. like one while loop and the
other for loop.
Thanks
Regards,
John

#define COUNT_VAR 32767

int main(int argc, char* argv[])

{

FILE *infile;
unsigned char string1[COUNT_VAR+1];
unsigned char DataOutBuffer[COUNT_VAR -1];
int ReturnVal;
int x;
if ( (infile=fopen("C:\\C\\all_sines.bin","rb")) != NULL )

{
fread ( string1,sizeof( char), COUNT_VAR, infile );
}

else

printf( "Problem opening the file\n" );

for( x=0; x <= COUNT_VAR-1 ; x++ )

{

DataOutBuffer[x]=string1[x];
printf("value =%d %d\n",x,DataOutBuffer[x] );

}

SetSignals (PodNumber, 0xFF /* Don't Care */, COUNT_VAR /*Max.
Length=32767*/, DataOutBuffer); // USB Command

}/*main*/

Aug 3 '05 #1
Share this Question
Share on Google+
4 Replies


P: n/a
On Wed, 03 Aug 2005 14:24:18 -0700, john wrote:

Hello,

I am trying to send 2^19 data to USB2.0. I am reading the file
"all_sines" and loading it into
an array called "string1". Then, in a for loop I copied it into the USB
data array "Data_outBuffer". The USB can
carry only "32767" bytes at one time. The way I am doing right now
requires 16 for loops to send the
2^19 amount of data. ( 32767 * 16 = 2^19). My USB function SetSignals
can only carry "32767 bytes at one time".


How about:

#define MAX_SEND 32767

int main(int argc, char* argv[])
{
FILE *infile;
int x;

if ( (infile=fopen("C:\\C\\all_sines.bin","rb")) != NULL )
{
// Loop until all data has been sent.
for (;;)
{
unsigned char buffer[MAX_SEND];
// Read up to MAX_SEND bytes.
int bytes = fread(buffer, sizeof(unsigned char), MAX_SEND, infile);
// Make sure we got some data.
if (bytes == 0)
break; // error or eof. use ferror if you care.
// Send the data.
SetSignals(PodNumber, 0xFF, bytes, buffer); // USB Command
}
}
else
printf( "Problem opening the file\n" );
}

- Jay
Aug 3 '05 #2

P: n/a
Hello,

Thanks for the reply! But this will be infinite loop. I want my loops
to run ( 16 * 32767 ) times. The problem is that how can I keep the
track of my "string1" array. for example I tried to the following thing

y=0;
x=0;
while ( y<17)
{
for (; x< COUNT_VAR-1;x++)
{
DataOutBuffer[x]=string1[x];
}
y=y+1;
x=x+1;
Setsignals (PodNumber,0xFF;COUNT_VAR,DataOutBuffer);
}

Now, if 'x' gets to 32767 which is also the "COUNT_VAR" then the "for
loop" will never execute again , it will just run once. My USB function
can only carry "32767" bytes and I need to send 2^19 bytes out.
Please adivce!

Thanks
Regards,
John



Jay Nabonne wrote:
On Wed, 03 Aug 2005 14:24:18 -0700, john wrote:

Hello,

I am trying to send 2^19 data to USB2.0. I am reading the file
"all_sines" and loading it into
an array called "string1". Then, in a for loop I copied it into the USB
data array "Data_outBuffer". The USB can
carry only "32767" bytes at one time. The way I am doing right now
requires 16 for loops to send the
2^19 amount of data. ( 32767 * 16 = 2^19). My USB function SetSignals
can only carry "32767 bytes at one time".


How about:

#define MAX_SEND 32767

int main(int argc, char* argv[])
{
FILE *infile;
int x;

if ( (infile=fopen("C:\\C\\all_sines.bin","rb")) != NULL )
{
// Loop until all data has been sent.
for (;;)
{
unsigned char buffer[MAX_SEND];
// Read up to MAX_SEND bytes.
int bytes = fread(buffer, sizeof(unsigned char), MAX_SEND, infile);
// Make sure we got some data.
if (bytes == 0)
break; // error or eof. use ferror if you care.
// Send the data.
SetSignals(PodNumber, 0xFF, bytes, buffer); // USB Command
}
}
else
printf( "Problem opening the file\n" );
}

- Jay


Aug 4 '05 #3

P: n/a
Hello,

Thanks for the reply! But this will be infinite loop. I want my loops
to run ( 16 * 32767 ) times. The problem is that how can I keep the
track of my "string1" array. for example I tried to the following thing

y=0;
x=0;
while ( y<17)
{
for (; x< COUNT_VAR-1;x++)
{
DataOutBuffer[x]=string1[x];
}
y=y+1;
x=x+1;
Setsignals (PodNumber,0xFF;COUNT_VAR,DataOutBuffer);
}

Now, if 'x' gets to 32767 which is also the "COUNT_VAR" then the "for
loop" will never execute again , it will just run once. My USB function
can only carry "32767" bytes and I need to send 2^19 bytes out.
Please adivce!

Thanks
Regards,
John

Aug 4 '05 #4

P: n/a
On Thu, 04 Aug 2005 09:05:29 -0700, john wrote:
Hello,

Thanks for the reply! But this will be infinite loop.
Only if the file is infinitely long. When the fread reaches end-of-file,
it will break out of the loop. By using the eof condition, you don't need
to hard-code it in your code. The code I provided also doesn't require the
source data to be a multiple of 32767.

I also didn't understand the need to copy the data to a separate buffer in
order to send it, but I assume it's needed for some reason, given your
tenacity in keeping it.
I want my loops
to run ( 16 * 32767 ) times. The problem is that how can I keep the
track of my "string1" array. for example I tried to the following thing

y=0;
x=0;
while ( y<17)
{
for (; x< COUNT_VAR-1;x++)
{
DataOutBuffer[x]=string1[x];
}
y=y+1;
x=x+1;
Setsignals (PodNumber,0xFF;COUNT_VAR,DataOutBuffer);
}

Now, if 'x' gets to 32767 which is also the "COUNT_VAR" then the "for
loop" will never execute again , it will just run once. My USB function
can only carry "32767" bytes and I need to send 2^19 bytes out.
Keep in mind: the buffer you're reading into is only COUNT_VAR bytes long.
You're not reading the entire file into it. So you're going to need to do
multiple reads in order to copy all the data.
Please adivce!


Following your loop above:

for (int x = 0; x < 17; ++x)
{
// Read COUNT_VAR bytes into the source string.
fread(string1, sizeof(unsigned char), COUNT_VAR, infile);
// Copy to the data output buffer.
memcpy(DataOutBuffer, string1, COUNT_VAR);
// Send the data.
Setsignals (PodNumber,0xFF;COUNT_VAR,DataOutBuffer);
}

Aug 4 '05 #5

This discussion thread is closed

Replies have been disabled for this discussion.