Fork me on Gitee

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)类、结构体或数组的元素

先定义的低地址,后定义的高地址

参考:

Intel格式与Motorola格式的区别

https://blog.csdn.net/oqqHuTu12345678/article/details/82823890

CAN总线上的消息单帧某个信号的值计算(C#)

posted @ 2021-04-28 15:36  VueDi  阅读(2812)  评论(0编辑  收藏  举报