解读程序:void I2C_test_MYJ(void) { unsigned char nnn = 0; unsigned char n = 0; uint8_t ii = 0; uint8_t io_first_flag = 0; uint8_t io_error0 = 0; uint8_t io_error1 = 0; uint32_t t_count0 = 0; uint32_t t_count1 = 0; uint32_t t_count2 = 0; uint32_t t_count3 = 0; uint32_t t_count4 = 0; /IO口引脚初始化*****************/ Gpio_InitIOExt(3,1,GpioDirOut,TRUE,FALSE,TRUE,FALSE); Gpio_InitIOExt(2,7,GpioDirOut,TRUE,FALSE,TRUE,FALSE); Gpio_InitIOExt(3,2,GpioDirOut,TRUE,FALSE,TRUE,FALSE); Gpio_InitIOExt(3,3,GpioDirOut,TRUE,FALSE,TRUE,FALSE); Gpio_SetIO(3,2,1); Gpio_SetIO(3,3,1); Gpio_SetIO(3,1,1); Gpio_SetIO(2,7,1); delay1ms(10); while(1) { delay1ms(5); if(0 == I2C0_Read(i2cRxData0,13))//mei lianjie { LED0_ON; io_error0 = 1; status = 1; error1[0]++; } else { i2cRxData0[13] = 0; for(ii = 0; ii < 12; ii++) { i2cRxData0[13] += i2cRxData0[ii]; } if(i2cRxData0[13] != i2cRxData0[12])//jduge { LED0_ON; io_error0 = 1; status = 4; error1[3]++; } if(i2cRxData0[10] == 0 && i2cRxData0[11] < 0X50)// yu zhen xiao { LED0_ON; io_error0 = 1; status = 2; error1[1]++; } }
时间: 2024-04-13 11:27:58 浏览: 93
这段程序主要是对I2C进行测试和处理。首先,定义了一些变量和计数器,包括nnn、n、ii、io_first_flag、io_error0、io_error1、t_count0、t_count1、t_count2、t_count3和t_count4。
然后,进行了一些IO口引脚的初始化,使用了Gpio_InitIOExt函数对一些引脚进行配置。
接下来,在一个无限循环中,每隔5毫秒延迟一次。然后通过调用I2C0_Read函数读取I2C数据,如果返回值为0,则表示没有连接成功。在这种情况下,LED0会点亮,io_error0会被置为1,status会被设置为1,并且error1[0]会自增。
如果连接成功,则对接收的数据进行处理。首先,将i2cRxData0[13]初始化为0,并对前12个字节进行累加,结果存储在i2cRxData0[13]中。然后,判断i2cRxData0[13]和i2cRxData0[12]是否相等,如果不相等,则表示数据错误。在这种情况下,LED0会点亮,io_error0会被置为1,status会被设置为4,并且error1[3]会自增。
接下来,判断i2cRxData0[10]是否为0且i2cRxData0[11]是否小于0x50。如果满足条件,则表示数据有效。在这种情况下,LED0会点亮,io_error0会被置为1,status会被设置为2,并且error1[1]会自增。
以上就是这段程序的基本逻辑和功能。
相关问题
uint16_t的数组转换成uint8的指针
uint16_t的数组转换成uint8的指针可以通过类型转换来实现。具体步骤如下:
1. 首先,定义一个uint16_t类型的数组,并初始化。
2. 创建一个uint8_t类型的指针,并将其指向数组的首地址。
3. 使用类型转换将uint16_t类型的数组转换为uint8_t类型的指针。
以下是示例代码:
```c++
#include <iostream>
#include <cstdint>
int main() {
uint16_t arr[] = { 1, 2, 3, 4, 5 };
int size = sizeof(arr) / sizeof(arr[0]);
uint8_t* ptr = reinterpret_cast<uint8_t*>(arr);
for (int i = 0; i < size * 2; i++) {
std::cout << static_cast<int>(*(ptr + i)) << " ";
}
return 0;
}
```
输出结果为:
1 0 2 0 3 0 4 0 5 0
给这段代码加上注释 //计算AGV矩形轮廓路径 计算角点:利用车头正方向的夹角差值计算车的四个角度 QPainterPath path; double carWidth =m_para.width; double carLength =m_para.length; double carAngle =m_attri->angle/100; double angle = atan((carWidth)/(carLength));//夹角差值 double length = sqrt(pow(carWidth,2)+pow(carLength,2))/2;//对角线长度的一半 //计算AGV外接矩形轮廓路径 /m_boundPath //矩形的四个顶点存储在m_agvRectPoints中,绘制AGV锁定区域需要用到m_agvRectPoints QPointF pointRT = calLinePath(path,length,carAnglePI/180+angle,true);//右上角 m_agvRectPoints[0]=pointRT; QPointF pointRB = calLinePath(path,length,carAnglePI/180-angle);//右下角--头 m_agvRectPoints[1]=pointRB; QPointF pointLB = calLinePath(path,length,carAnglePI/180+angle+PI);//左下角--尾 m_agvRectPoints[2]=pointLB; QPointF pointLT = calLinePath(path,length,carAnglePI/180-angle+PI);//左上角--尾 m_agvRectPoints[3]=pointLT; path.closeSubpath(); m_path = path; //计算AGV锁定矩形轮廓路径 /m_trackPath QPainterPath trackPath; double tracklength = sqrt(pow(carWidth+carWidth/2.0,2)+pow(carLength+carLength/2.0,2))/2;//对角线长度的一半 //agv锁定矩形随agv旋转 --MYJ 2021.12.14 calLinePath(trackPath, tracklength, -(carAnglePI / 180 + angle), true);//右上角 calLinePath(trackPath, tracklength, -(carAnglePI / 180 - angle));//右下角--头 calLinePath(trackPath, tracklength, -(carAnglePI / 180 + angle + PI));//左下角--尾 calLinePath(trackPath, tracklength, -(carAnglePI / 180 - angle + PI));//左上角--尾 trackPath.closeSubpath(); m_boundaryPath = trackPath;
//计算AGV矩形轮廓路径
//计算角点:利用车头正方向的夹角差值计算车的四个角度
QPainterPath path; //定义画笔路径对象
double carWidth = m_para.width; //获取AGV宽度
double carLength = m_para.length; //获取AGV长度
double carAngle = m_attri->angle / 100; //获取AGV车头角度
double angle = atan((carWidth) / (carLength)); //计算夹角差值
double length = sqrt(pow(carWidth, 2) + pow(carLength, 2)) / 2; //计算对角线长度的一半
//计算AGV外接矩形轮廓路径 /m_boundPath
//矩形的四个顶点存储在m_agvRectPoints中,绘制AGV锁定区域需要用到m_agvRectPoints
QPointF pointRT = calLinePath(path, length, carAngle * PI / 180 + angle, true); //计算右上角点
m_agvRectPoints[0] = pointRT; //存储右上角点
QPointF pointRB = calLinePath(path, length, carAngle * PI / 180 - angle); //计算右下角点(车头)
m_agvRectPoints[1] = pointRB; //存储右下角点(车头)
QPointF pointLB = calLinePath(path, length, carAngle * PI / 180 + angle + PI); //计算左下角点(车尾)
m_agvRectPoints[2] = pointLB; //存储左下角点(车尾)
QPointF pointLT = calLinePath(path, length, carAngle * PI / 180 - angle + PI); //计算左上角点(车尾)
m_agvRectPoints[3] = pointLT; //存储左上角点(车尾)
path.closeSubpath(); //闭合路径
m_path = path; //存储路径
//计算AGV锁定矩形轮廓路径 /m_trackPath
QPainterPath trackPath; //定义画笔路径对象
double tracklength = sqrt(pow(carWidth + carWidth / 2.0, 2) + pow(carLength + carLength / 2.0, 2)) / 2; //计算对角线长度的一半
//agv锁定矩形随agv旋转 --MYJ 2021.12.14
calLinePath(trackPath, tracklength, -(carAngle * PI / 180 + angle), true); //计算右上角点
calLinePath(trackPath, tracklength, -(carAngle * PI / 180 - angle)); //计算右下角点(车头)
calLinePath(trackPath, tracklength, -(carAngle * PI / 180 + angle + PI)); //计算左下角点(车尾)
calLinePath(trackPath, tracklength, -(carAngle * PI / 180 - angle + PI)); //计算左上角点(车尾)
trackPath.closeSubpath(); //闭合路径
m_boundaryPath = trackPath; //存储路径
阅读全文