CAN软件控制
本页包含所有可用的CAN软件控制功能 AnyMath .
|
使用CAN软件控制功能 AnyMath ,按照指定的方式安装硬件支持包 文章. 安装后,运行:
接下来,您需要创建一个CAN对象。:
|
#
主要。工程师。装置。可以。n.公共汽车,公共汽车-Method
CAN.bus_status(device, channel::String)->Int64
巴士状况:
-
0--没有错误; *非零值是错误。
论点
-
设备::主要.工程师。装置。可以。[医]CanType:CAN设备对象。 -
频道::字符串:频道ID(例如,"can0","virtual_0").
#
主要。工程师。装置。可以。创建总线-Method
CAN.create_bus(device, interface::String, channel::String, kbits::Float64, auto_reset::Bool, is_fd::Bool=false, data_kbits::Float64=0.0, timing=nothing)
使用指定的设置创建和激活CAN总线。
论点
-
设备::主要.工程师。装置。可以。[医]CanType:CAN设备对象。 -
接口::字符串:接口类型("socketcan","pcan","马拉松","虚拟"). -
频道::字符串:频道ID(例如,"can0","virtual_0"). -
kbits::Float64:以kbit/s为单位的传输速率。 -
auto_reset::Bool:错误时自动重启; -
is_fd::Bool:是否使用CAN FD(可选,默认错误); -
数据轨道::Float64:CAN FD的速度(可选,默认0.0); -
时间::联盟{Nothing, CanFdTiming, CanTiming}:附加定时参数(可选,默认什么都没有).
#
主要。工程师。装置。可以。毁灭总线-Method
CAN.destroy_bus(device, channel::String)
停止并移除CAN总线。
论点
-
设备::主要.工程师。装置。可以。[医]CanType:CAN设备对象。 -
频道::字符串:频道ID(例如,"can0","virtual_0").
#
主要。工程师。装置。可以。get_tx_rx_errors-Method
CAN.get_tx_rx_errors(device, channel::String)->Vector{Int64}
返回接收和传输期间错误数的向量 [tx_errors,rx_errors].
论点
-
设备::主要.工程师。装置。可以。[医]CanType:CAN设备对象。 -
频道::字符串:频道ID(例如,"can0","virtual_0").
#
主要。工程师。装置。可以。recv的-Method
CAN.recv(device, channel::String, timeout::Float64, async_rpc::Bool=false)->Union{Nothing, CanMessage}
接收超时的单个消息(以秒为单位)。 申报表 什么都没有 如果没有消息。
论点
-
设备::主要.工程师。装置。可以。[医]CanType:CAN设备对象。 -
频道::字符串:频道ID(例如,"can0","virtual_0"). -
超时::Float64:超时以秒为单位。 -
async_rpc::Bool:可选,默认情况下错误. 如果真的,接收是异步执行的。
#
主要。工程师。装置。可以。重置-Method
CAN.reset(device, channel::String)
重新启动接口(总线关闭后恢复).
论点
-
设备::主要.工程师。装置。可以。[医]CanType:CAN设备对象。 -
频道::字符串:频道ID(例如,"can0","virtual_0").
#
主要。工程师。装置。可以。发送-Method
CAN.send(device, channel::String, message::CanMessage, async_rpc::Bool=false)
发送CAN消息。
论点
-
设备::主要.工程师。装置。可以。[医]CanType:CAN设备对象。 -
频道::字符串:频道ID(例如,"can0","virtual_0"). -
信息::CanMessage:正在发送的CAN消息。 -
async_rpc::Bool:可选,默认情况下错误. 如果真的,发送是异步执行的,调用是非阻塞的。
#
主要。工程师。装置。可以。set_bus_settings-Method
CAN.set_bus_settings(device, interface::String, channel::String, kbits::Float64, auto_reset::Bool, is_fd::Bool=false, data_kbits::Float64=0.0, timing=nothing)
在创建总线之前配置CAN接口。
论点
-
设备::主要.工程师。装置。可以。[医]CanType:CAN设备对象。 -
接口::字符串:接口类型("socketcan","pcan","马拉松","虚拟"). -
频道::字符串:频道ID(例如,"can0","virtual_0"). -
kbits::Float64:以kbit/s为单位的传输速率。 -
auto_reset::Bool:错误时自动重启; -
is_fd::Bool:是否使用CAN FD(可选,默认错误); -
数据轨道::Float64:CAN FD的速度(可选,默认0.0); -
时间::联盟{Nothing, CanFdTiming, CanTiming}:附加定时参数(可选,默认什么都没有).
#
主要。工程师。装置。可以。set_filters-Method
CAN.set_filters(device, channel::String, filter_id::Int64, mask::Int64)
通过仲裁ID进行硬件验收筛选。 过滤器 (0, 0) 接受所有消息。
论点
-
设备::主要.工程师。装置。可以。[医]CanType:CAN设备对象。 -
频道::字符串:频道ID(例如,"can0","virtual_0"). -
filter_id::Int64:过滤器的ID。 -
面膜::Int64:指定仲裁ID的哪些位应匹配的掩码。
#
主要。工程师。装置。可以。start_stream-Method
CAN.start_stream(device, channel::String, sample_time::Float64=0.01)->Tuple{String, String}
以预设步骤开始串流接收。 返回amqpstream的队列名称。
论点
-
设备::主要.工程师。装置。可以。[医]CanType:CAN设备对象。 -
频道::字符串:频道ID(例如,"can0","virtual_0"). -
采样时间::Float64:开始接收的步骤(可选,默认0.01)
CAN消息的结构
Base.@kwdef struct CanMessage
timestamp::Float64 # метка времени
arbitration_id::Int64 # ID сообщения (11 или 29 бит)
is_extended_id::UInt8 # 1 — 29-битный ID
is_remote_frame::UInt8 # 1 — RTR
is_error_frame::UInt8 # 1 — кадр ошибки
is_fd::UInt8 # 1 — CAN FD
bitrate_switch::UInt8 # 1 — переключение скорости
error_state_indicator::UInt8
dlc::Int64 # длина данных (0–8 Classic, 0–64 FD)
data::Union{Vector{UInt8}, Int64}
end
例子:
界面 虚拟
can = CAN.Can()
CAN.set_bus_settings(can, "virtual", "virtual_0", 500.0, true)
CAN.set_bus_settings(can, "virtual", "virtual_1", 500.0, true)
CAN.create_bus(can, "virtual", "virtual_0", 500.0, true)
CAN.create_bus(can, "virtual", "virtual_1", 500.0, true)
CAN.set_filters(can, "virtual_0", 0, 0)
data_field = rand(UInt8, 8)
message = CanMessage(
timestamp = rand(Float64),
arbitration_id = rand(UInt32),
is_extended_id = 0,
is_remote_frame = 0,
is_error_frame = 0,
is_fd = 0,
bitrate_switch = 0,
error_state_indicator = 0,
dlc = length(data_field),
data = data_field,
)
CAN.send(can, "virtual_0", message, true)
msg = CAN.recv(can, "virtual_1", 0.0)
println("Отправлено: $data_field")
println("Получено: $(msg.data)")
CAN.destroy_bus(can, "virtual_0")
CAN.close(can)
可以FD
CAN.set_bus_settings(can, "socketcan", "can0", 500.0, true, true, 2000.0)
CAN.create_bus(can, "socketcan", "can0", 500.0, true, true, 2000.0)
fd_message = CanMessage(
timestamp = time(), arbitration_id = 0x123,
is_extended_id = 0, is_remote_frame = 0, is_error_frame = 0,
is_fd = 1, bitrate_switch = 1, error_state_indicator = 0,
dlc = 64, data = rand(UInt8, 64),
)
CAN.send(can, "can0", fd_message)