在ESP32学习中发现ESP32函数内部打印的数据和返回出去的数据完全不一样,在函数内部打印如下:
float get_angle()
{
byte head[2];
byte raw_data[9];
if (Serial2.available())
{
Serial2.readBytes(head,2);
if(head[0]==0x55&&head[1]==0x53)
{
Serial2.readBytes(raw_data,9);
}
uint16_t x_raw = ((uint16_t)raw_data[1]<<8)|(uint16_t)raw_data[0];
uint16_t y_raw = ((uint16_t)raw_data[3]<<8)|(uint16_t)raw_data[2];
uint16_t z_raw = ((uint16_t)raw_data[5]<<8)|(uint16_t)raw_data[4];
float x = (float)x_raw/32768.0*180.0;
float y = (float)y_raw/32768.0*180.0;
float z = (float)z_raw/32768.0*180.0;
//Serial.write((uint8_t)z);
if(x>180.0)
{
x -= 360.0;
}
if(y>180.0)
{
y -= 360.0;
}
if(z>180.0)
{
z -= 360.0;
}
Serial.println(z);
return z;
}
打印的是返回值z,此时打印正常。

然后将其return,在主函数里面读取返回值:
float z1;
float pid_u;
float target_angle_z=0;
//extern int BASE_SPEED;
uint8_t kkk=0;
float sta=0;
void setup() {
//BASE_SPEED=0;
usart2_init();
//delay(3000);
z_zero();
//z1=get_angle();
//init_pid(0.07,0.001,0.1);
//setupMotors();
//setMotorSpeed(BASE_SPEED); // 初始速度设置*/
}
void loop() {
z1=0;
z1=get_angle();
Serial.println(z1);
//pid_u=compute_pid(0,get_actvalue(target_angle_z,z1));
//if(4*pid_u>100)
//{
//pid_u=25;
//}
//if(4*pid_u<100)
//{
/// pid_u=-25;
//}
//setLEFTspeed(BASE_SPEED+(int)(2*sta*pid_u));
//setRIGHTspeed(BASE_SPEED-(int)(2*sta*pid_u));
//kkk=Serial.read();
//controlcar();
}
此时会打印一个固定值,无论如何转动陀螺仪都不会改变:

如果让两者同时输出,就会在一大堆错误的值里面打印一点正确的值,整体如下:

代码如下:
main.cpp:
#include <Arduino.h>
//#include "Motoriese_aandrywing.h"
#include "usart2.h"
//#include "pid.h"
//#include "usart.h"
float z1;
float pid_u;
float target_angle_z=0;
//extern int BASE_SPEED;
uint8_t kkk=0;
float sta=0;
void setup() {
//BASE_SPEED=0;
usart2_init();
//delay(3000);
z_zero();
//z1=get_angle();
//init_pid(0.07,0.001,0.1);
//setupMotors();
//setMotorSpeed(BASE_SPEED); // 初始速度设置*/
}
void loop() {
z1=0;
z1=get_angle();
Serial.println(z1);
//pid_u=compute_pid(0,get_actvalue(target_angle_z,z1));
//if(4*pid_u>100)
//{
//pid_u=25;
//}
//if(4*pid_u<100)
//{
/// pid_u=-25;
//}
//setLEFTspeed(BASE_SPEED+(int)(2*sta*pid_u));
//setRIGHTspeed(BASE_SPEED-(int)(2*sta*pid_u));
//kkk=Serial.read();
//controlcar();
}
usart2.h:
#include <Arduino.h>
void usart2_init();
float get_angle();
void z_zero();
usart.cpp:
#include "usart2.h"
void usart2_init()
{
Serial2.begin(9600);
Serial.begin(9600);
}
float get_angle()
{
byte head[2];
byte raw_data[9];
float z=0;
if (Serial2.available())
{
Serial2.readBytes(head,2);
if(head[0]==0x55&&head[1]==0x53)
{
Serial2.readBytes(raw_data,9);
}
uint16_t x_raw = ((uint16_t)raw_data[1]<<8)|(uint16_t)raw_data[0];
uint16_t y_raw = ((uint16_t)raw_data[3]<<8)|(uint16_t)raw_data[2];
uint16_t z_raw = ((uint16_t)raw_data[5]<<8)|(uint16_t)raw_data[4];
float x = (float)x_raw/32768.0*180.0;
float y = (float)y_raw/32768.0*180.0;
z = (float)z_raw/32768.0*180.0;
//Serial.write((uint8_t)z);
if(x>180.0)
{
x -= 360.0;
}
if(y>180.0)
{
y -= 360.0;
}
if(z>180.0)
{
z -= 360.0;
}
Serial.print(z);
Serial.print(" ");
return z;
}
return z;
}
void z_zero()
{
byte send_data[5];
send_data[0]=0xff;
send_data[1]=0xaa;
send_data[2]=0x69;
send_data[3]=0x88;
send_data[4]=0xb5;
Serial2.write(send_data, sizeof(send_data));
delay(200);
send_data[2]=0x01;
send_data[3]=0x04;
send_data[4]=0x00;
Serial2.write(send_data, sizeof(send_data));
delay(3000);
send_data[2]=0x00;
send_data[3]=0x00;
send_data[4]=0x00;
Serial2.write(send_data, sizeof(send_data));
delay(1000);
}
请问一下各位朋友这是如何回事?怎么改进呢?