C语言, 关于16进制的串口发送的问题

已给函数void send_data_uart(unsigned char word),可以将一个字节的数据通过串口发送,现在我有一个十进制数为123456789,对应的16进制数为75BCD15,我如何通过串口发送数据,使得上位机以十六进制接收到的数据格式为0x15,0xCD,0x5B,0x07呢?脑子有点迷糊~请大家指教~~

第1个回答  2012-09-23
先定义一个union { unsigned int i;unsigned char ac[4];} udata;
udata.i=1;
if ( udata.ac[0]== 1 ) //小端机,则从低到高发送
{
udata.i=123456789 ;
int j=0;
while( j<4 )
{
send_data_uart( udata.ac[j] );
j++ ;
}
}
else //大端机,从高到低发送
{
udata.i=123456789 ;
int j=4;
while( j-->0 )
{
send_data_uart( udata.ac[j] );
}

}
修正楼上的方法一,应该采用位与:
unsigned int val = 123456789;

send_data_uart( val & 0xff );
send_data_uart( (val >> 8) & 0xff );
send_data_uart( (val >> 16)& 0xff );
send_data_uart( (val >> 24)& 0xff );
请将贴结给楼上,我认为它的方法一效果更好
第2个回答  推荐于2017-11-25
多谢kaixingui2012 指正

第一种方法:
unsigned int val = 123456789;

send_data_uart( val & 0xff );
send_data_uart( (val >> 8) & 0xff );
send_data_uart( (val >> 16) & 0xff );
send_data_uart( (val >> 24) & 0xff );

第二种:
unsigned int val = 123456789;
unsigned char *p;

p = (unsigned char *)&val;

send_data_uart( p[0] );
send_data_uart( p[1] );
send_data_uart( p[2] );
send_data_uart( p[3] );

第一种较通用,第二种发送顺序跟大小端有关系。本回答被提问者采纳
第3个回答  2012-09-23
可以这么写:
void send_oct_num(long int number){
unsigned char ch;
while(number){
ch=number&0xff;
number>>=8;
send_data_uart(ch);
}
}

send_oct_num(123456789)就行了,
这下就没问题了,有什么不清楚的可以再问。
第4个回答  2012-09-23
unsigned long num;
unsigned char send_num;
num=123456789;
send_num=num&255;//0至7位
send_data_uart(send_num);//发送0x15
send_num=num>>8;//8至15位
send_data_uart(send_num);//发送0xcd
send_num=num>>16;//16至23位
send_data_uart(send_num);//发送0x5b
send_num=num>>24;//24至31位
send_data_uart(send_num);//发送0x07
或者定义一个数组得到4个字节的数据,然后通过循环连续发送。
第5个回答  2012-09-23
没明白
相似回答