大小端模式
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位 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?