We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
xdata unsigned long var_long _at_ 0x0150; unsigned char * pointer; pointer=0x0150; var_long=0x45213256; SBUF=*pointer; ... SBUF=*(pointer+1); ... SBUF=*(pointer+2); ... SBUF=*(pointer+3); ...
my uart communication work, when i send datas byte one byte. when i try to send a long variable in above form , uart com. dont work. is this format illegal? xdata unsigned long var_long _at_ 0x0150; unsigned char * pointer; pointer=0x0150; var_long=0x45213256;
*pointer : 0x45 ?? *(pointer+1) : 0x21 ?? *(pointer+2) : 0x32 ?? *(pointer+3) : 0x56 ??
You are assigning an integer to a generic pointer. I think you either need to make the pointer mspace specific or assign it thusly:
pointer = (unsigned char xdata *)0x0150;
Or just get rid of the "magic numbers" altogether and let the compiler do it for you:
pointer = &var_long;
that way you know it'll be right!
which is the alternative non-portable approach
Which is portable, and may be no less efficient...
"Or just get rid of the "magic numbers" altogether ..."
But then it wouldn't be nearly so magic when (if) it works and what's the fun in that?
like: pointer[0], pointer[1], pointer[2], pointer[3]
like
pointer = (unsigned char *) &longvar; ... SBUF = *pointer++; // msb (assumes big-endianness) ... SBUF = *pointer++; // 2sb ... SBUF = *pointer++; // 3sb ... SBUF = *pointer++; // lsb
To be pedantic, that's post-increment - not auto-increment
If the underlying architecture has an auto-increment facility, the compiler might use it to implement the post-increment...
Right you are, thank you. I stand corrected :)