#include "tof10120.h" u8 state = STATE_NONE; u8 index_dat = 0; int distance = 0; u8 flag_getdis = 0; void stateMachine_tof(u8 dat){ switch(state){ case STATE_NONE: if(dat == 'm'){ state = STATE_READY; } break; case STATE_READY: if(dat == 0x0a){ state = STATE_GET_DAT; } break; case STATE_GET_DAT: if(dat == 'm'){ state = STATE_GET_END; flag_getdis = 1; index_dat = 0; } else if(dat>0x2f || dat<0x3a){ if(index_dat == 0){ distance = 0; } index_dat++; distance = distance*10 + dat - 0x30; } else{ state = STATE_NONE; } break; case STATE_GET_END: if(dat == 'm'){ state = STATE_READY; } else{ state = STATE_NONE; } break; } }
时间: 2024-01-07 21:02:32 浏览: 23
这段代码是用来控制 TOF10120 模块的状态机。模块会发送一串数据,其中包含距离信息。代码中的变量 state 表示当前状态,index_dat 表示当前处理到的数据位数,distance 表示解析出的距离值,flag_getdis 表示是否成功解析出距离值。当收到字符 'm' 时,表示开始接收数据,进入 STATE_READY 状态。接下来通过判断收到的字符,进入不同的状态进行数据处理。当成功解析出距离值时,flag_getdis 被置为 1,并将 index_dat 和 distance 重置。最后,当收到字符 'm' 时,表示一次数据接收结束,进入 STATE_READY 状态,等待下一次数据接收。
相关问题
void UserI2c_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( I2C_SCL_CLK, ENABLE ); RCC_APB2PeriphClockCmd( I2C_SDA_CLK, ENABLE ); GPIO_InitStructure.GPIO_Pin = I2C_SCL_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(I2C_SCL_PORT, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = I2C_SDA_PIN; GPIO_Init(I2C_SDA_PORT, &GPIO_InitStructure); GPIO_SetBits(I2C_SCL_PORT, I2C_SCL_PIN); //SCL 输出高 GPIO_SetBits(I2C_SDA_PORT, I2C_SDA_PIN); //SDA 输出高 /************************/ /**配置TOF内部寄存器*****/ /**代码改于2022/6/1_dpt**/ /************************/ devid=I2C_DEVID; //设置I2C从机地址 默认164 0xA4 dirt_send_flag=1; //=0串口主动发送 =1串口或者I2C被动读取 SensorWritenByte(devid,(unsigned char *)&dirt_send_flag, 0x09, 1); //0x09设置距离发送方式 1 主机去读取 0 模块发送 delay_ms(100); dirt_detection_flag=0; //=0滤波值 =1实时值 SensorWritenByte(devid,(unsigned char *)&dirt_detection_flag, 0x08, 1); //0x08设置 距离数据模式 1 实时值 0滤波值 delay_ms(100); }
这段代码是用于初始化I2C通信的函数,函数名为UserI2c_Init。该函数主要完成以下几个任务:
1. 配置SCL和SDA引脚的GPIO模式和速度,使其成为推挽输出模式,并打开SCL和SDA引脚所在的GPIO时钟。
2. 将SCL和SDA引脚输出高电平,作为初始状态。
3. 设置I2C从机地址为0xA4(164),并将dirt_send_flag设置为1,表示串口或者I2C被动读取距离数据。然后调用SensorWritenByte函数向从机发送设置距离发送方式的命令,并等待100ms。
4. 将dirt_detection_flag设置为0,表示读取距离时使用滤波值。然后调用SensorWritenByte函数向从机发送设置距离数据模式的命令,并等待100ms。
最后,函数执行完毕,I2C通信就可以正常使用了。
CALL LEVEL(DATS,NOEVT,AVGLEV2,siglev2,para) para(4)=2.0*siglev2 sum_amp_TOF1=0.0 do l=1,int(para(8)+0.5) sum_amp_TOF1=sum_amp_TOF1+dats(l) end do
这段代码是一个Fortran语言的子程序调用和循环。首先,通过调用名为LEVEL的子程序,将DATS、NOEVT、AVGLEV2、siglev2和para作为参数传递给它。在子程序中,para(4)的值被设置为2.0乘以siglev2的值。
接下来,sum_amp_TOF1被初始化为0.0。然后,通过一个do循环,从l=1到int(para(8)+0.5)的范围内,对dats(l)进行累加,将累加结果赋值给sum_amp_TOF1。这段代码的作用是计算dats数组中某个范围内元素的总和,并将结果存储在sum_amp_TOF1变量中。