libmodbus-rs 0.4.3

Binding to libmodbus. Libmodbus is a free software library to send/receive data with a device which respects the Modbus protocol. This library can use a serial port or an Ethernet connection. http://libmodbus.org/
extern crate libmodbus_rs;

use libmodbus_rs::{Modbus, ModbusServer, ModbusMapping, ModbusTCP, MODBUS_TCP_MAX_ADU_LENGTH};
use libmodbus_rs::errors::*;


fn run() -> Result<()> {
    let mut modbus = Modbus::new_tcp("127.0.0.1", 1502)?;
    // modbus.set_debug(true)?;

    let modbus_mapping = ModbusMapping::new(500, 500, 500, 500)?;

    let mut socket = modbus.tcp_listen(1)?;
    modbus.tcp_accept(&mut socket)?;


    loop {
        let mut query = vec![0u8; MODBUS_TCP_MAX_ADU_LENGTH as usize];

        match modbus.receive(&mut query) {
            Ok(n) => {
                modbus.reply(&query, n, &modbus_mapping)
            }
            Err(_) => {
                break
            }
        }?;
    }
    println!("Quit the loop: Connection reset by peer");

    // ModbusMapping and Modbus struct are dropped here, automatically by Rusts Drop trait.
    // Hence no manual `modbus_mapping_free(mb_mapping)`, `modbus_close(ctx)` nor `modbus_free(ctx)` needed, like in C.

    Ok(())
}


fn main() {
    if let Err(ref err) = run() {
        println!("Error: {}", err);

        std::process::exit(1)
    }
}