-
最近在搞 websocket, 服務端是用 python 寫的,所以,我需要用python 控制 can 去傳輸相關信息。
-
python-can 模塊就是 python 控制 can 的模仿。
-
利用 buildroot 去生成 python-can 模塊
cd $BUILDROOT_PATH
make menuconfig
Target packages --->
Interpreter languages and scripting --->
[*] python3
External python modules --->
[*] python-can
make
// 生成的文件在 output/target/usr/lib/python3.5/site-packages/
// 將這個文件 拷貝到自己的文件系統的 ust/lib/python3.5 里面
https://python-can.readthedocs.io/en/latest/index.html#
#!/usr/bin/python3
import os; ''' 這是加載 os 模塊, 調用shell 命令 '''
import can; ''' 加載python-can 模塊 '''
can.rc['interface'] = 'socketcan_native' ``` Linux 里面的 socketcan 在am335x 上面應該使用這個 ```
can.rc['channel'] = 'can1' ''' can 接口名字 '''
can.rc['bitrate'] = 1000000 ''' 波特率 1M '''
from can.interfaces.interface import Bus
''' 這個函數是can 的啟動函數 '''
def can_setup(can_name):
can_setup_command = "canconfig " + can_name + " bitrate 1000000 restart-ms 1000 ctrlmode triple-sampling on";
can_start_command = "canconfig " + can_name + " start";
pass;
os.system(can_setup_command);
os.system(can_start_command);
''' can 停止函數 '''
def can_stop(can_name):
can_stop_command = "canconfig " + can_name + " stop";
os.system(can_stop_command);
''' 發送信息 '''
def send_one():
bus = can.interface.Bus();
msg = can.Message(arbitration_id=0x7f,
data=[11, 25, 11, 1, 1, 2, 23, 18],
extended_id=False);
try:
bus.send(msg); ''' 發送信息 '''
print("Message sent on {}".format(bus.channel_info));
except can.CanError:
print("Message NOT sent");
def recv():
bus = can.interface.Bus();
msg = bus.recv(100); ''' 接收信息 '''
try:
bus.send(msg);
print(msg);
print(msg.data[0]); # 接收回來的第一個字節的數據
print(msg.arbitration_id); # 接收回來的ID
return msg;
except can.CanError:
print("Message NOT sent");
if __name__ == "__main__":
''' can_setup("can1"); '''
send_one();
recv();
''' can_stop("can1"); '''