zlgcan_driver

Crates.iozlgcan_driver
lib.rszlgcan_driver
version3.0.0-rc2
sourcesrc
created_at2024-03-28 02:50:14.769761
updated_at2024-08-13 04:53:17.83739
descriptionA ZLGCAN driver with rust.
homepagehttps://github.com/zhuyu4839/zlgcan-driver-rs
repositoryhttps://github.com/zhuyu4839/zlgcan-driver-rs
max_upload_size
id1188674
size16,852,673
(zhuyu4839)

documentation

README

How to use:

use can_type_rs::frame::Frame;
use can_type_rs::identifier::Id;
use zlgcan_common::can::{CanChlCfgExt, CanChlCfgFactory, ZCanChlMode, ZCanChlType, CanMessage};
use zlgcan_common::device::ZCanDeviceType;
use zlgcan_common::error::ZCanError;
use zlgcan_driver::driver::{ZCanDriver, ZDevice};

#[test]
fn main() -> anyhow::Result<()> {
    let dev_type = ZCanDeviceType::ZCAN_USBCANFD_200U;
    let dev_idx = 0;

    // Create driver instance
    let mut driver = ZCanDriver::new(dev_type as u32, dev_idx, None)?;

    // Open device
    driver.open()?;

    // Get device info and assert some information
    let dev_info = driver.device_info()?;
    assert_eq!(dev_info.can_channels(), 2);
    assert_eq!(dev_info.canfd(), true);

    // Create channel configuration factory
    let factory = CanChlCfgFactory::new()?;
    let ch1_cfg = factory.new_can_chl_cfg(dev_type as u32, ZCanChlType::CANFD_ISO as u8, ZCanChlMode::Normal as u8, 500_000,
                                          CanChlCfgExt::new(None, Some(1_000_000), None, None, None, None))?;
    let ch2_cfg = factory.new_can_chl_cfg(dev_type as u32, ZCanChlType::CANFD_ISO as u8, ZCanChlMode::Normal as u8, 500_000,
                                          CanChlCfgExt::new(None, Some(1_000_000), None, None, None, None))?;
    let cfg = vec![ch1_cfg, ch2_cfg];

    // intialize channels
    driver.init_can_chl(cfg)?;

    // Create CANFD frame
    let mut msg = CanMessage::new(
        Id::from_bits(0x7df, false), [0x01, 0x02, 0x03, 0x04, 0x05].as_slice()
    )
        .ok_or(ZCanError::Other("invalid data length".to_string()))?;
    msg.set_can_fd(true);
    let frames = vec![msg];

    // Transmit frame
    let ret = driver.transmit_canfd(0, frames)?;
    assert_eq!(ret, 1);

    driver.close();

    Ok(())
}

How to test

  • Enter driver/tests folder. Select test file by your device type.
  • If the channels of device is less than 2:
    • Connect another CAN device with you device's channel for a monitor.
    • Then run the selected testcase.
    • When see receive frame from the monitor, then send frame by the monitor device.
    • It means pass when the testcase exited without any panic.
  • If the channels of device is rather than 2:
    • Connected the channels 0 and 1.
    • Then run the selected testcase.
    • It means pass when the testcase exited without any panic.
  • All testcase will output the send and received debug info.

The tested device list(include windows and linux):

  • USBCAN1 (include office device and deriving device)
  • USBCAN2 (only deriving device)
  • USBCANFD-200U
  • USBCANFD-400U (without supporting channel 3 and 4)

LICENSE

  • GNU LESSER GENERAL PUBLIC LICENSE V3
Commit count: 78

cargo fmt