小栗子 发表于 2023-5-17 14:53:25

C#中如何解析CAN信号?

如下所示:
BO_ 1603 Message_TCU4: 8 Vector__XXX
SG_ Pump_MotorSpeed_16U : 43|16@0+ (1,0) "MPa" Vector__XXX
SG_ TCU_FaultNum_8U : 35|8@0+ (1,0) "N/A" Vector__XXX
SG_ TCU3_3_Ratio_12U : 31|12@0+ (1,0) "N/A" Vector__XXX
SG_ TCU3_2_TargetSecPressure_12U : 11|12@0+ (1,0) "N/A" Vector__XXX
SG_ TCU3_1_SecPressure_12U : 7|12@0+ (1,0) "MPa" Vector__XXX

这是一帧Motorola 格式数据,接收数据如图


请大佬帮忙写个算法包含Motorola 和 intel格式。传入 起始位,长度,接收数据。返回计算值。先感谢了

isdkz 发表于 2023-5-17 14:55:15

CAN信号的解析通常需要根据信号的起始位和长度,以及信号的数据类型和单位来进行计算。以下是C#中解析CAN信号的示例代码:

public static double ParseCanSignal(int startBit, int signalLength, byte[] data, double factor, double offset)
{
    // 将字节数组转换为二进制字符串
    string binaryString = string.Join("", data.Select(b => Convert.ToString(b, 2).PadLeft(8, '0')));

    // 获取信号的二进制字符串
    string signalBinaryString = binaryString.Substring(binaryString.Length - startBit - signalLength, signalLength);

    // 将二进制字符串转换为十进制数值
    int signalValue = Convert.ToInt32(signalBinaryString, 2);

    // 计算信号的实际值
    double signalRealValue = signalValue * factor + offset;

    return signalRealValue;
}


其中, startBit 表示信号的起始位, signalLength 表示信号的长度, data 表示接收到的CAN数据字节数组, factor 表示信号的比例因子, offset 表示信号的偏移量。函数返回解析后的信号实际值。

例如,对于上述示例中的 Pump_MotorSpeed_16U 信号,其起始位为43,长度为16,单位为 MPa ,比例因子为1,偏移量为0,则可以通过以下代码解析:

byte[] data = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
double factor = 1;
double offset = 0;
double signalValue = ParseCanSignal(43, 16, data, factor, offset);
Console.WriteLine("Pump_MotorSpeed_16U: {0} MPa", signalValue);

小栗子 发表于 2023-5-17 15:19:19

isdkz 发表于 2023-5-17 14:55
CAN信号的解析通常需要根据信号的起始位和长度,以及信号的数据类型和单位来进行计算。以下是C#中解析CAN信 ...

别问chatgpt,问了自己算一下再来回答

高山 发表于 2023-5-19 17:34:47

isdkz 发表于 2023-5-17 14:55
CAN信号的解析通常需要根据信号的起始位和长度,以及信号的数据类型和单位来进行计算。以下是C#中解析CAN信 ...

请勿频繁使用ChatGPT是!!!
还用
页: [1]
查看完整版本: C#中如何解析CAN信号?