c++ - Arduino - 尝试优化速度,需要回显传感器数据

标签 c++ char arduino printf concatenation

问题:

我有一个 6 DoF 加速度计,我可以通过 ArduinoUNO 通过 SDA/SCL 访问它。我可以通过以下命令读取输入:

LreadAccX()

传感器有 2 个寄存器,一个低值和一个高值。以上将读取较低寄存器的 X 加速度。这些是 8 位数。例如,上面可能返回:

LreadAccX()
>>>> 01000010

顺便说一下,十进制的 41。我需要尽快把它们拿出来,如果可能的话,我们想要 1kHz 到 400Hz。这意味着只需吐出二进制数据,然后对其进行后期处理。

例子:

0000 0001  1100 1001

这可能是 X 加速度的值。它以十进制表示:457。这是我必须记录的 3 个不同的 ASCII 字符,而不是二进制中的 2 个。

1111 0001  1100 1001

这是 61897,所以有 5 个 ASCII 字符,而只有 2 个二进制字符。显然,我想使用二进制来优化速度。

我的解决方案

void loop() {
  /* 
  print data to processing. Data broken up into 2 parts, one for the high and low
  registers in the sensor.
  */
  print_bytes(HreadAccX(),LreadAccX(),HreadAccY(),LreadAccY(),HreadAccZ(),LreadAccZ());
              print_bytes(HreadGyroX(),LreadGyroX(),HreadGyroY(),LreadGyroY(),HreadGyroZ(),LreadGyroZ());
  Serial.print("A");
}

inline void print_bytes (int HaX, int LaX, int HaY, int LaY, int HaZ, int LaZ)
{
char l = (LaZ >> 48) & 0xff ;
char k = (LaZ >> 44) & 0xff ;
char j = (HaZ >> 40) & 0xff ;
char i = (HaZ >> 36) & 0xff ;
char h = (LaY >> 32) & 0xff ;
char g = (LaY >> 28) & 0xff ;
char f = (HaY >> 24) & 0xff ;
char e = (HaY >> 20) & 0xff ;
char d = (LaX >> 16) & 0xff ;
char c = (LaX >> 12) & 0xff ;
char b = (HaX >> 8) & 0xff ;
char a = HaX & 0xff ;
putchar (l) ;
putchar (k) ;
putchar (j) ;
putchar (i) ;
putchar (h) ;
putchar (g) ;
putchar (f) ;
putchar (e) ;
putchar (d) ;
putchar (c) ;
putchar (b) ;
putchar (a) ;
Serial.print(l);
Serial.print(k);
Serial.print(j);
Serial.print(i);
Serial.print(h);
Serial.print(g);
Serial.print(f);
Serial.print(e);
Serial.print(d);
Serial.print(c);
Serial.print(b);
Serial.print(a);
}

输出是这样的:

>>>> asFkDi?g-g^&A
as Fk Di ?g -g ^& A (for clarity, the diff 16 bits have spaces, and the 'A' is
                     to show a start/stop bit)

它只是 ASCII 中的垃圾,但它转换为有意义的 16 位数字

然而,这款 Chewbacca 就优雅而言。它还以大约 200Hz 的频率运行,太慢了。我觉得这是

Serial.print();

减慢速度的功能。但是,如果我尝试:

Serial.print(a+b+c+d+e+f+g+h+i+j+k+l);

我得到的只是数字的相加。

我的问题

如何让 Seria.print() 从一组参数中输出一串二进制数字?

最佳答案

您可能需要 Serial.write。假设 HaX 等都是一个字节,你可以使用类似的东西:

char data_bytes[] =  {HaX, LaX, HaY, LaY, HaZ, LaZ};
Serial.write(data_bytes, sizeof(data_bytes));

发送所有这些 8 位值。

虽然有些问题:

  • 串行上的原始二进制文件不会留下任何字符代码来指示帧的开始和结束,因此您可能会遇到同步问题。通常二进制串行协议(protocol)有一个特殊的帧起始字符和特殊的转义字符。每当其中一个出现在数据流中时,您都需要对其进行“转义”(发送修改后的 2 字节序列来代替原始“特殊”字节)以免混淆接收方。

  • 当您有一个函数调用会给出单独的高值和低值,然后将它们组合在一起时,您需要确保它们是一对匹配的。如果调用之间的值发生变化,您可能会收到错误。

  • 与执行串行打印功能时相比,您更可能受到串行连接波特率的限制。如果您最多发送 12 字节序列,您将只能在 19.2kbps 时获得 160Hz,或在 115.2kbps 时获得 960Hz

关于c++ - Arduino - 尝试优化速度,需要回显传感器数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22161375/

相关文章:

java - 从 Java 发送 int 到 Arduino

c++ - 什么是 "balanced-token-seq"

c++ - 在 std::vector 中调整大小与 push_back :它是否避免了不必要的复制分配?

c++ - #include 标题在哪里?

C++ 模板特化 char* 和 Valgrind

python - 我怎样才能增加一个字符?

c++ - char数组的正确输入法?

c++ - 在 return 语句中调用构造函数

char - arduino 中的 char* 声明是什么?

c++ - Arduino:类型 'void (ClassName::)()' 的参数在附加中断时与 'void (*)()' 不匹配