使用I2C读取CMPS 10指南针时,音调包含在一个字节中
在+/- 90度范围内。

使用char接受结果并将其转换为int可以在Arduino Uno上很好地工作,并且打印输出显示正数和负数,这正是我所需要的。

#include "FastLED.h"

#define NUM_LEDS 150
#define DATA_PIN 6

#define CMPS_GET_ANGLE8  0x12
#define CMPS_GET_PITCH   0x14
#define BAUD38400        0xA1


CRGB leds[NUM_LEDS];

unsigned char  angle8;
char pitch;
int intpitch;



void setup()
{
  FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
  Serial.begin(9600);
  Serial1.begin(9600);
  delay(100);
  Serial1.write(BAUD38400);
  Serial1.end();
  Serial1.begin(38400);
  delay(100);

}

void loop()
{
  getAngleAndPitch();

  Serial.print("angle 8: ");        // Display 8bit angle
  Serial.print(angle8, DEC);
  Serial.print("    pitch: ");          // Display pitch data
  intpitch = pitch;
  Serial.println(intpitch);


  FastLED.showColor(CHSV(angle8, 200,200));
  delay(10);
}
void getAngleAndPitch()
{
  Serial1.write(CMPS_GET_ANGLE8);  // Request and read 8 bit angle
  while(Serial1.available() < 1);
  angle8 = Serial1.read();

  Serial1.write(CMPS_GET_PITCH);   // Request and read pitch value
  while(Serial1.available() < 1);
  pitch = Serial1.read();

}


在Arduino DUE上,负数-1至-90为255至165

是否在某处有记录,如何在不借助IF语句的情况下获得正确的负数?

最佳答案

C ++标准未指定char类型是带符号还是无符号。在您的情况下,UNO似乎使用了签名字符,而Due则使用了未签名字符。

您可以直接指定变量的签名:

signed char pitch;


或者,您可以使用固定长度的整数typedef(在<cstdint>标头中找到):

int8_t pitch;


通常,除非有充分的理由,否则您最好使用精确宽度类型。

08-16 11:53