使用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;
通常,除非有充分的理由,否则您最好使用精确宽度类型。