Can通讯中Intel与Motorola区别
一、高地址和低地址
二、高字节低字节
如十六进制:0x01 00 00 04 。则04属于低字节,01属于高字节
三、大小端模式
(1)在内存中的存放顺序为低字节存放在高地址,则为大端模式
Motorola高字节(高位)在前(低地址).
(2)在内存中的存放顺序为低字节存放在低地址,则为小端模式
Intel低字节(低位)在前(低地址)
四、大小端相互转换
通过移位操作再或
1 //16位 2 ushort A; 3 (A & 0xFF00)>>8 | (A & 0x00FF)<<8; 4 5 //32位 6 ushort A; 7 (A & 0xFF000000)>>24 | (A & 0x00FF0000)>>8 8 |(A & 0x0000FF00)<<8 | (A & 0x000000FF)<<24;
五:Intel与Motorola内存图
信号的起始位,一般来讲,主机厂在定义整车CAN总线通信矩阵时,其每一个信号都从其最低位开始填写,这样也符合使用习惯。所以信号的起始位就是信号的最低位。这也与CANoe中CANdb++的定义Startbit含义一致。
CAN总线上的消息单帧某个信号的值计算(C#)
1 public static ulong GetMotorolaSignalValue(byte[] data, int startBit, int bitLength) 2 { 3 ulong canSignalValue = 0; 4 for (int i = data.Length - 1, j = 0; i >= 0; i--, j++) 5 { 6 canSignalValue += (ulong)data[j] << (i * 8); 7 } 8 9 int x = startBit / 8; 10 int y = startBit % 8; 11 int z = x * 8 + 8 - y; 12 int rightMoveCount = data.Length * 8 - z; 13 14 canSignalValue >>= rightMoveCount; 15 16 return canSignalValue & ulong.MaxValue >> 64 - bitLength; 17 } 18 19 public static ulong GetIntelSignalValue(byte[] data, int startBit, int bitLength) 20 { 21 ulong canSignalValue = 0; 22 for (int i = data.Length - 1; i >= 0; i--) 23 { 24 canSignalValue += (ulong)data[i] << (i * 8); 25 } 26 27 int x = startBit / 8; 28 int y = startBit % 8; 29 30 int rightMoveCount = x * 8 + y; 31 canSignalValue >>= rightMoveCount; 32 return canSignalValue & ulong.MaxValue >> 64 - bitLength; 33 }
内存中各对象存放顺序
1、原则
(1)一个整数类型内部
低地址存储低位,高地址存储高位。比如int a=1,则存储情况为0000(高地址) 0000 0000 0001(低地址)
(2)若干个局部变量(在栈中存储的)
先定义的高地址,后定义的低地址
(3)类、结构体或数组的元素
先定义的低地址,后定义的高地址
参考:
https://blog.csdn.net/oqqHuTu12345678/article/details/82823890
作者:VueDi
出处:https://www.cnblogs.com/VueDi/
本文版权归作者所有,欢迎转载,转载请注明出处:VueDi:(https://www.cnblogs.com/VueDi/)