接线
星瞳教程
发送数据
接收数据
不过我比较奇怪为何它们的uart不需要初始化
openmv传送数据
1、初始化以及uart参数设置
uart = pyb.UART(3, 115200) #串口3,波特率115200
uart.init(115200, bits=8, parity=None, stop=1) #8位数据位,无校验位,1位停止位
2、将数据和帧头(一般来说是两个帧头)打包,发送打包好的数据
关于函数的用法请见:https://docs.openmv.io/library/ustruct.html?highlight=ustruct
ustruct.pack(fmt,v1,v2,… )
根据格式字符串fmt打包值v1,v2 … 。返回值是对值进行编码的字节对象。
fmt 参数意义
def send_data_packet(x, y):
temp = struct.pack("
TITLE1, #帧头1
TITLE2, #帧头2
int(x), #数据1
int(y)) #数据2
uart.write(temp) #串口发送
可以根据自己的需求添加变量以及帧头。
一帧数据的每一个Byte必须要以字节的显示发送(data = bytearray([x,y])),而不能是用16进制发送(uart.write("%x %x r"%(x,y))),他们两个函数在串口助手里面看到的内容是一样的(大小写的区别),但是后者是无法让单片机接收到的。
STM32解码程序
void Optical_Flow_Receive_Prepare(u8 data)
{
/* 局部静态变量:接收缓存 */
static u8 RxBuffer[10];
/* 数据长度 *//* 数据数组下标 */
static u8 _data_cnt = 0;
/* 接收状态 */
static u8 state = 0;
/* 帧头1 */
if(state==0&&data==TITLE1)
{
state=1;
}
/* 帧头2 */
else if(state==1&&data==TITLE2)
{
state=2;
_data_cnt = 0;
}
/* 接收数据租 */
else if(state==2)
{
RxBuffer[++_data_cnt]=data;
if(_data_cnt>=8)
{
state = 0;
Data_Processing(RxBuffer,_data_cnt);
}
}
/* 若有错误重新等待接收帧头 */
else
state = 0;
}
void Data_Processing(u8 *data_buf,u8 num)
{
int theta_org,rho_org;
/* 读取偏移角度原始数据 */
theta_org = (int)(*(data_buf+1)<<0) | (int)(*(data_buf+2)<<8) | (int)(*(data_buf+3)<<16) | (int)(*(data_buf+4)<<24) ;
theta_err = theta_org;
/* 读取偏移尺寸原始数据 */
rho_org = (int)(*(data_buf+5)<<0) | (int)(*(data_buf+6)<<8) | (int)(*(data_buf+7)<<16) | (int)(*(data_buf+8)<<24) ;
rho_err = rho_org;
}
接线
星瞳教程
发送数据
接收数据
不过我比较奇怪为何它们的uart不需要初始化
openmv传送数据
1、初始化以及uart参数设置
uart = pyb.UART(3, 115200) #串口3,波特率115200
uart.init(115200, bits=8, parity=None, stop=1) #8位数据位,无校验位,1位停止位
2、将数据和帧头(一般来说是两个帧头)打包,发送打包好的数据
关于函数的用法请见:https://docs.openmv.io/library/ustruct.html?highlight=ustruct
ustruct.pack(fmt,v1,v2,… )
根据格式字符串fmt打包值v1,v2 … 。返回值是对值进行编码的字节对象。
fmt 参数意义
def send_data_packet(x, y):
temp = struct.pack("
TITLE1, #帧头1
TITLE2, #帧头2
int(x), #数据1
int(y)) #数据2
uart.write(temp) #串口发送
可以根据自己的需求添加变量以及帧头。
一帧数据的每一个Byte必须要以字节的显示发送(data = bytearray([x,y])),而不能是用16进制发送(uart.write("%x %x r"%(x,y))),他们两个函数在串口助手里面看到的内容是一样的(大小写的区别),但是后者是无法让单片机接收到的。
STM32解码程序
void Optical_Flow_Receive_Prepare(u8 data)
{
/* 局部静态变量:接收缓存 */
static u8 RxBuffer[10];
/* 数据长度 *//* 数据数组下标 */
static u8 _data_cnt = 0;
/* 接收状态 */
static u8 state = 0;
/* 帧头1 */
if(state==0&&data==TITLE1)
{
state=1;
}
/* 帧头2 */
else if(state==1&&data==TITLE2)
{
state=2;
_data_cnt = 0;
}
/* 接收数据租 */
else if(state==2)
{
RxBuffer[++_data_cnt]=data;
if(_data_cnt>=8)
{
state = 0;
Data_Processing(RxBuffer,_data_cnt);
}
}
/* 若有错误重新等待接收帧头 */
else
state = 0;
}
void Data_Processing(u8 *data_buf,u8 num)
{
int theta_org,rho_org;
/* 读取偏移角度原始数据 */
theta_org = (int)(*(data_buf+1)<<0) | (int)(*(data_buf+2)<<8) | (int)(*(data_buf+3)<<16) | (int)(*(data_buf+4)<<24) ;
theta_err = theta_org;
/* 读取偏移尺寸原始数据 */
rho_org = (int)(*(data_buf+5)<<0) | (int)(*(data_buf+6)<<8) | (int)(*(data_buf+7)<<16) | (int)(*(data_buf+8)<<24) ;
rho_err = rho_org;
}
举报