写在前面
这篇文章是在树莓派上写的,正好写完代码
1 树莓派传输
1.1 前置工作
首先:打开树莓派的iic
如果你使用的是图形桌面,非常好,直接在左上角首选项>Raspberry Pi Configuration>Interfaces 里面把i2c打开就可以
如果你用的命令行,在终端输入sudo raspi-config
1.2 查看你的iic设备地址
先安装必要的工具:sudo apt-get install i2c-tools
查看所有iic设备的地址:i2cdetect -y 1
从i2c设备读出所有寄存器的值: sudo i2cdump -y 1 <设备地址>
往某一个iic设备中的某一个寄存器中写入某一个值:sudo i2cset -y 1 <设备地址><寄存器地址><写入的值>
从某一个地址的某一个寄存器读出值:sudo i2cget -y 1<设备地址><寄存器地址>
2 python实现
我们使用smbus这个库:
首先实例化
from smbus2 import SMBus
i2c = SMBus(1) # 1 代表 /dev/i2c-1
然后打开一个设备
i2c = SMBus(1)
从设备读取一个值:read_byte(i2c_addr, force=None)
向设备写入一个值:write_byte(i2c_addr, value, force=None)
从指定的寄存器中读取一个字节:read_byte_data(i2c_addr, register, force=None)
从给定的寄存器中读取字节数据块:read_i2c_block_data(i2c_addr, register, length(数据块大小), force=None)
将字节数据块写入给定寄存器:write_i2c_block_data(i2c_addr, register(起始寄存器), data, force=None)
我们以arduino和树莓派的通讯为例:
Arduino:
// 直接在Arduino IDE选择“文件”→“示例”→Wire→slave_receiver,可以打开该文件
#include <Wire.h>
void setup() {
Wire.begin(8); // Wire初始化, 并以从设备地址8的身份加入IIc总线
Wire.onReceive(receiveEvent); // 注册一个IICqwq事件,用于响应主机的数据发送
Serial.begin(9600); // 初始化串口并设置波特率为9600
}
void loop() {
delay(100);
}
// 当主机发送的数据被收到时,将触发 receiveEvent() 事件
void receiveEvent(int howMany) {
String inString="";
// 循环读取收到的数据,最后一个数据单独读取
char x = Wire.read(); // 以整型形式接收数据
Serial.print(x); // 串口输出该整型变量
inString += char(x);
//Serial.println(inString);
inString="";
}
然后是树莓派部分
import time
import numpy as np
from smbus2 import SMBus
i2c = SMBus(1)
i2c.open(1)
while 1:
inf = time.ctime()
adr = 0x08
str_list = np.fromstring(inf,dtype=np.uint8)
str_list=np.append(str_list,10)
for i in str_list:
#print(i)
i = int(i)
i2c.write_byte(adr,i,force=None)
import time
import numpy as np
from smbus2 import SMBus
i2c = SMBus(1)
i2c.open(1)
while 1:
inf = "0010!"
adr = 0x08
str_list = np.fromstring(inf,dtype=np.uint8)
str_list=np.append(str_list,10)
import serial
serial_port = serial.Serial(
port=’/dev/ttyUSB0′,
baudrate=115200,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
)
serial_port.write("T0rn".encode())
str = ""
while True:
if serial_port.inWaiting() > 0:
data = serial_port.read().decode()
if data == ‘n’:
print(str)
str = ""
else:
str = str + data