#circular-buffer #modbus #buffer #data-stream #no-std

no-std modbus_buffer

适用于无标准库环境中的Modbus通信的环形缓冲区实现

2个版本

0.0.2 2024年4月29日
0.0.1 2024年4月29日

#307 in 嵌入式开发

MIT许可协议

21KB
386

ModbusBuffer

ModbusBuffer是一个Rust库,提供了针对Modbus通信的环形缓冲区实现。它设计用于高效处理Modbus帧的缓冲,具有可配置的帧长度和可选的缓冲区满时数据覆盖功能。这个库在无标准库(即no_std环境)的系统中特别有用。这个库的初始目的是允许在RS485上解码Modbus流而不必担心silences

功能

  • 环形缓冲区:高效管理Modbus存储的环形缓冲区。
  • 可配置的帧长度:设置最小和最大帧大小。
  • 覆盖选项:在缓冲区满时选择覆盖旧数据或恐慌。
  • CRC检查:包含计算和验证Modbus帧的CRC16功能。
  • 帧解码:在接收到每个字节时尝试持续解码帧,这在无法可靠检测到静默(表示帧的结束)的场合中是理想的。

安装

将以下内容添加到您的Cargo.toml

[dependencies]
modbus_buffer = "0.0.2"

示例用法

use modbus_buffer::ModbusBuffer;

fn main() {
    let mut buffer = ModbusBuffer::<16>::new()
        .min_frame_len(3)
        .max_frame_len(8)
        .overwrite(true);
    
    // start receiving data in the middle of a request
    buffer.push(0xCD);  // value
    buffer.push(0x9F);  // crc
    buffer.push(0xBE);  // crc

    // Receive a second request
    buffer.push(0x12);  // unit address
    buffer.push(0x06);  // fn code
    buffer.push(0x22);  // addr
    buffer.push(0x22);  // addr
    buffer.push(0xAB);  // value
    buffer.push(0xCD);  // value
    buffer.push(0x9F);  // crc
    buffer.push(0xBE);  // crc
    
    let mut output = [0u8; 16];
    // Here, the 'noise' from previous request will be dropped and the second request detected
    let len = buff.try_decode_frame(&mut output);

    
}

贡献

欢迎贡献!如果您发现错误或有改进建议,请随时提交拉取请求或创建问题。

无运行时依赖