UART 与 CAN 互转对测记录
1. 硬件使用
PC端:串口—>CSM300A(转换)
测试端:imx6ull的CAN接口
2. PC端发送数据(ubuntu)
2.1 方式一:使用 cutecom 串口工具进行发送数据
cutecom 发送数据(hex):
接收端数据
root@ATK-IMX6U:~ip link set can0 type can bitrate 125000 # 设置为125000k
root@ATK-IMX6U:~ifconfig can0 up # 开启 can0
root@ATK-IMX6U:~# candump can0 # 接收数据
can0 00010203 [6] 04 05 06 07 08 09 # 00010203为帧ID
can0 00010203 [5] 04 05 06 07 08
2.2 方式二:使用 echo 进行发送数据
2.2.1 PC发送端格式:
abc@abc:~$ echo -ne "\x01\x02\x03\x04\x05\x06\x07" | sudo tee /dev/ttyCH9344USB2
这条命令的作用是将十六进制字符串\x01\x02\x03\x04\x05\x06\x07发送到/dev/ttyCH9344USB2设备中。
-n 选项抑制了echo命令的自动换行。
-e 选项启用了对转义字符的解释,允许在字符串中使用特殊字符(如\x01表示十六进制字符)。
sudo tee /dev/ttyCH9344USB2 将输出写入到指定设备,需要管理员权限。
abc@abc:~$ echo -ne "\x01\x02\x03\x04\x05\x06\x07" | sudo tee /dev/ttyCH9344USB2
abc@abc:~$ echo -ne "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c" | sudo tee /dev/ttyCH9344USB2
abc@abc:~$ echo -ne "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e" | sudo tee /dev/ttyCH9344USB2
2.2.2 接收端
root@ATK-IMX6U:~candump can0
can0 01020304 [3] 05 06 07 #01020304对应发送数据的\x01\x02\x03\x04为帧ID(我购买的CSM300A默认帧ID的长度和起始地址)
can0 01020304 [8] 05 06 07 08 09 0A 0B 0C
can0 01020304 [8] 05 06 07 08 09 0A 0B 0C
can0 01020304 [2] 0D 0E
2.2.3 补充两种 echo 的写法区别,这两条命令的区别在于管道符号 |
的使用。
- 第一条命令:
echo -ne "\x01\x02\x03\x04\x05\x06\x07" | sudo tee /dev/ttyCH9344USB2
这个命令会先使用 echo
命令输出十六进制序列到标准输出,然后通过管道 |
将输出送到 sudo tee
命令。
echo -ne "\x01\x02\x03\x04\x05\x06\x07"
:会将十六进制序列直接输出到标准输出。-n
参数用于防止在结尾处添加换行符,而-e
参数允许对转义字符进行解释。sudo tee /dev/ttyCH9344USB2
:tee
命令会将标准输入的数据写入到指定文件 (/dev/ttyCH9344USB2
),同时也会将数据复制到标准输出。由于需要权限才能写入/dev/ttyCH9344USB2
,所以在命令前面加了sudo
。
- 第二条命令:
sudo echo -ne "\x01\x02\x03\x04\x05\x06\x07" > /dev/ttyCH9344USB2
这个命令直接在命令行中使用 echo
输出,并通过 >
重定向将输出内容写入 /dev/ttyCH9344USB2
。
sudo echo -ne "\x01\x02\x03\x04\x05\x06\x07"
:在大多数情况下,这条命令会导致权限错误,因为sudo
只会应用到echo
命令,而不会应用到重定向操作符>
。因此,大多数情况下,你将会遇到权限问题。> /dev/ttyCH9344USB2
:这是一个输出重定向符号,它将echo
的输出写入到/dev/ttyCH9344USB2
设备中。
总结起来,第一条命令是正确的写法,因为它通过 sudo tee
提升了写入权限,并且不会遇到权限问题。第二条命令大多数情况下会遇到权限问题,因为 sudo
只会应用到 echo
命令,而不会应用到 >
重定向操作符。
3. 反向传输
使用 mx6ull 的 CAN0 接口向 CSM300A 发送数据最后由串口接收。
3.1 发送格式
使用 cansend 命令通过 can0 向接收单元发送8个字节数据:
root@ATK-IMX6U:~# cansend can0 1a8#0102030405060708
cansed 命令用于发送can数据,“1a8"是帧ID,” # “号后面的"0102030405060708” 是要发送的数据。
-注:CAN2.0,一次最多发送8个字节的数据。
3.2 数据接收
使用 CuteCom 接收数据,如下:
# Hex output接收的数据
08 01 a8 00 00 01 02 03 04 05 06 07 08
08:数据长度
01 a8:帧ID
00 00:分割符号“#”
01 02 03 04 05 06 07 08:接收的数据