slowtec / tokio-modbus

A tokio-based modbus library
Apache License 2.0
396 stars 118 forks source link

Although disconnect the context, the SerialStream reopen error #212

Open ileon opened 1 year ago

ileon commented 1 year ago
use anyhow::Result;
use tokio_modbus::prelude::*;
use tokio_modbus::{client::rtu, Slave};
use tokio_serial::SerialStream;

#[tokio::main(flavor = "current_thread")]
async fn main() -> Result<()> {
    {
        let builder = tokio_serial::new("COM9", 9600);
        let port = SerialStream::open(&builder)?;
        let mut ctx1 = rtu::attach_slave(port, Slave(1));
        let rsp1 = ctx1.read_holding_registers(1, 2).await;
        println!("rsp1: {:?}", rsp1);
        ctx1.disconnect().await?;
    }
    let builder = tokio_serial::new("COM9", 9600);
    let port_try_open = SerialStream::open(&builder);
    let port = match port_try_open {
        Ok(p) => p,
        Err(err) => {
            println!("Re-open Error: {:?}", err);
            panic!();
        }
    };
    let mut ctx2 = rtu::attach_slave(port, Slave(2));
    let rsp2 = ctx2.read_holding_registers(1, 2).await;
    println!("rsp2: {:?}", rsp2);

    Ok(())
}

The error message is :

rsp1: Ok([250, 1]) Re-open Error: Error { kind: NoDevice, description: "Access is denied." }

Please help to check how to re-build another new Context after drop the previous one. and the disconnect method seems did not work.

ileon commented 1 year ago

I know there is a set_slave() method, but why in above code, it was panic ? the disconnect looks not work ? the SerialStream did not drop in the first {} block ? how to drop the SerialStream properly? I have tried, but can not get the right method to re-build Context