.NET 7在ARM平台使用Span<T>触发System.DataMisalignedException问题
问题分析
出现System.DataMisalignedException的核心原因是ARM32平台的内存对齐要求:RevPi Core S基于ARMv7架构,该架构要求4字节数据类型(如float)必须从4字节对齐的内存地址读取;而x86/x64平台允许不对齐内存访问(仅性能下降,不会抛出异常)。
你使用的FluentModbus 5.0.2的泛型方法ReadHoldingRegisters<float>,内部可能直接将未对齐的byte[]内存区域强制转换为Span<float>,触发ARM的对齐检查异常。
解决方案
放弃使用泛型转换方法,改用手动字节转float的方式,绕开对齐问题。利用你已经读取的calibration字节数组(已通过ModbusEndianness.LittleEndian处理好字节顺序),直接通过BitConverter完成转换:
// 替换原泛型方法的代码 var floatCalibration = new float[2]; // 第一个校准值K:对应前4字节(小端) floatCalibration[0] = BitConverter.ToSingle(calibration, 0); // 第二个校准值B:对应后4字节 floatCalibration[1] = BitConverter.ToSingle(calibration, 4); Console.WriteLine("calibration K: " + floatCalibration[0]); Console.WriteLine("calibration B: " + floatCalibration[1]);
验证逻辑
从你的输出可以确认字节数组是正确的:
- 十六进制字符串
0000003F9A993940拆分后为0000003F和9A993940 - 小端模式下,
0000003F反转成3F000000,对应float值0.5 9A993940反转成4039999A,对应float值2.9
手动转换会完全复现x64平台的正确结果。
内容的提问来源于stack exchange,提问作者Ingar Hjelle
相关产品推荐
相关产品推荐

