大小端模式

  https://www.cnblogs.com/little-white/p/3236548.html

一 大端模式就是高位存在低地址(看着顺序一致),例如0X1234,内存地址是0X4000的话,0x4000=0x12;0x4001=0x34;

大端模式一般存在网络协议和MODBUS(先发高字节再发低字节)等中,符号位的判定固定为第一个字节,容易判断正负;C51也是大端模式。

小端模式常存在于处理器中,如ARM中,强制转换数据不需要调整字节内容,如果要进行MODBUS打包数据则要进行高低字节交换。

所以向eeprom中存入字节序按大端存储:keil下的u16先进行高低字节转换__REV16(A),然后进行强制类型转换拷贝写入;读出时先读到一个将u16数组地址强制转换字节指针中,然后进行对u16进行__REV16(A)转换。

modbus协议栈自动会将大端序的字节流存储到小端模式的keil下的u16中,发送时会将小端模式的u16进行高低字节转换成大端序字节流发送。

#define BigtoLittle16(A)   (( ((uint16)(A) & 0xff00) >> 8) | (( (uint16)(A) & 0x00ff) << 8))或者用专门的汇编指令:
#define Little16toBig(A)  __REV16(A)

大小端的判断:可以用将16bit数据强制按字节访问低字节内容,如果等于高位字节值则为大端,否则小端
       或者用共用体union来访问16bit和8bit内容,判断方法一样
举例说明:u8 a[4]={0xc0,0xa8,0x1,0xfa};
u8 b[2]={0x1234,0x5678};
memcpy(b,a,4);//此时b[2]={0xac0,0xfa01};
memcpy(a,b,4);//a[4]={0x34,0x12,0x78,0x56};

modbus协议通信时U32如何发送和接收处理的解决办法

typedef union                                        
{
   float f_Buf;  //小数
   u8  uc_Buf[4];  //u8,用于存放IEEE754类型的小数
   u16 us_Buf[2];  //u16,用于将IEEE754类型的小数存放到保持寄存器中 
   u32 u_Buf;
}float_DtformConver;

/*2个U16的保持寄存器转换为U32*/
u32 HoldReg_Read4Byte(u16 usHoldRegAddr)
{
    float_DtformConver Data;
    u32 temp;
    Data.us_Buf[0]= usSRegHoldBuf[usHoldRegAddr];
    Data.us_Buf[1]= usSRegHoldBuf[usHoldRegAddr+1];
    temp = Data.u_Buf;
    return temp;
}

/*将u32类型放入保持寄存器中*/
void HoldReg_Write4Byte(u16 usHoldRegAddr,u32 value)
{
    float_DtformConver Data;
    Data.u_Buf = value;//获取u32类型的数据
    usSRegHoldBuf[usHoldRegAddr] = Data.us_Buf[0];获取低16位
    usSRegHoldBuf[usHoldRegAddr+1] = Data.us_Buf[1];//获取高16位
}
View Code

 

 



posted on 2019-05-20 11:35  杰瑞鼠  阅读(860)  评论(0编辑  收藏  举报