ubuntu使用虚拟can
1. sudo modprobe vcan //加载虚拟can模块
2. sudo ip link add dev can0 type vcan //添加can0网卡
3. ifconfig -a //查看can0
4. sudo ip link set dev can0 up //开启can0
5. sudo ip link set dev can0 down //关闭can0
6. sudo ip link del dev can0 //删除can0
ubuntu调试can
安装调试工具
sudo apt install can-utils
candump --version
CAN启动
ip link set can0 down //关闭CAN
ip link set can0 type can bitrate 500000 //设置⽐特率500KHz
ip -details -statistics link show can0 //打印can0信息
ip link set can0 up //启动CAN
CAN发送
cansend can0 123#DEADBEEF //发送(标准帧,数据帧,ID:123,date:DEADBEEF)
cansend can0 123#R //发送(标准帧,远程帧,ID:123)
cansend can0 00000123#12345678 //发送(扩展帧,数据帧,ID:00000123,date:DEADBEEF)
cansend can0 00000123#R //发送(扩展帧,远程帧,ID:00000123)
CAN接收
candump can0
using SocketCANSharp; using SocketCANSharp.Network; using System.Text; namespace CanCore { internal class Program { public static string ToHexString(byte[] bytes) { string hexString = string.Empty; if (bytes != null) { StringBuilder strB = new StringBuilder(); for (int i = 0; i < bytes.Length; i++) { strB.Append(bytes[i].ToString("X2") + " "); } hexString = strB.ToString(); } return hexString.Trim(); } static void Main(string[] args) { CanNetworkInterface vcan0 = CanNetworkInterface.GetAllInterfaces(true).First(iface => iface.Name.Equals("can0")); using (var senderSocket = new RawCanSocket()) using (var receiverSocket = new RawCanSocket()) { senderSocket.Bind(vcan0); receiverSocket.Bind(vcan0); int bytesWritten = senderSocket.Write(new CanFrame(0x123, new byte[] { 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef })); while (true) { int bytesRead = receiverSocket.Read(out CanFrame frame); if (bytesRead > 0) { Console.WriteLine($"bytesRead:{bytesRead},CanId:{frame.CanId},Data:{ ToHexString(frame.Data) }"); } Thread.Sleep(1000); } } Console.ReadLine(); } } }