【问题标题】:How do I pass the function argument in arduino?如何在arduino中传递函数参数?
【发布时间】:2019-07-23 00:44:32
【问题描述】:

我正在尝试通过在微控制器中写入寄存器值来控制电机的速度。

unsigned long PrintHex32( uint32_t data) // prints 32-bit data in hex with leading zeroes
{
  uint32_t data2 = data << 8;
  char tmp[16];
  uint16_t LSB = data2 & 0xffff;
  uint16_t MSB = data2 >> 16;
  unsigned long ppsval2 = sprintf(tmp, "0x%.4X%.4X%", MSB, LSB);
  Serial.println(tmp);
  Serial.println("***************");
  return tmp;
}
void NoRamp() {
  Serial.println("No Ramp");
  unsigned long ppsVal = (VMAX * FS * uS);
  unsigned long   ppsVal3 = PrintHex32(ppsVal);
  Serial.println(ppsVal);
  Serial.println(ppsVal3);
  Serial.println("$$$$$$");

  //********* NO Ramp **********////////
  sendData(0xA0, 0x00000000); //RAMP Mode
  //  sendData(0xA4, 0x03E80000); //VMAX-5rps/5hz
  //  sendData(0xA4, 0x00c80000);
  sendData(0xA4, ppsVal3); //VMAX-1rps/1hz

}

最后我需要在十六进制转换后发送数据格式sendData(0xA4, 0x00c80000)

但目前,我正在获取打印输出:

No Ramp
0x00C80000
***************
51200
0
$$$$$$

嗯,我在哪里犯了错误?任何人都可以请给我一点头! 谢谢大家!!

PS:如果有人需要知道,senddata 方法也可以使用下面的参数!

unsigned long sendData(unsigned long address, unsigned long datagram)

编辑: 我想我能理解要问的正确问题吗?

unsigned long PrintHex32( uint32_t data) // prints 32-bit data in hex with leading zeroes
{
  uint32_t data2 = data << 8;
  //char tmp[16];
  uint16_t LSB = data2 & 0xffff;
  uint16_t MSB = data2 >> 16;
   unsigned long  val = xxxx(uint16_t LSB) + uint16_t MSB(YYY);
  //sprintf(tmp, "0x%.4X%.4X%", MSB, LSB);
  return val ;
}

如果您可以看到我使用 uint16_t LSBuint16_t MSB 将我的输入数据 2 转换为十六进制。如何将这两个值保存为一个 unsigned long val 。然后我可以返回那个变量。 我认为使用 sprintf 方法是错误的,因为它只显示字符表示? 如果我错了,请纠正我?

【问题讨论】:

  • 已经很长了。 "unsigned long sendData(unsigned long address, unsigned long datagram)" 如果你是参考发送数据方法
  • PrintHex32 具有返回类型 unsigned longreturn tmp; 尝试返回 char[16] - 这甚至不应该编译。
  • 你调用的是 sendData(0xA4, 0x00c80000) ,第一个参数是地址,第二个是数据,所以函数原型应该是unsigned long sendData( unsigned long* address, unsigned long data);
  • 请您检查一下新的编辑好吗!

标签: c++ arduino bit-manipulation arduino-c++


【解决方案1】:

编辑中的 xxxx 应该是 2^16 aka 65536:

#include <cassert>
using namespace std;

int main(int argc, char * argv[]) {

unsigned int data2 = 12345678;
uint16_t LSB = data2 & 0xffff;
uint16_t MSB = data2 >> 16;
unsigned long  val = (1<<16) * MSB + LSB;
unsigned long  val2 = 65536 * MSB + LSB;
assert(val == data2);
assert(val2 == data2);
}

【讨论】:

    猜你喜欢
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多