标签: arduino

在C中从'char'到'int*的无效转换

我有以下数组:

int A[] = {0,1,1,1,1, 1,0,1,0,0, 0,1,1,1,1};
int B[] = {1,1,1,1,1, 1,0,1,0,1, 0,1,0,1,0};
int C[] = {0,1,1,1,0, 1,0,0,0,1, 1,0,0,0,1};
//etc... for all letters of the alphabet 
Run Code Online (Sandbox Code Playgroud)

还有一个在5x3 LED矩阵上打印字母的功能:

void printLetter(int letter[])
Run Code Online (Sandbox Code Playgroud)

我有一串字母:

char word[] = "STACKOVERFLOW";
Run Code Online (Sandbox Code Playgroud)

我想将字符串的每个字符传递给printLetter函数.

我试过了:

int n = sizeof(word);

for (int i = 0; i < n-1; i++) {  
    printLetter(word[i]);
}
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误:从'char'到'int*'的无效转换

我该怎么办?

谢谢!!

c arduino

0
推荐指数
1
解决办法
6779
查看次数

Arduino上的头文件出现奇怪的编译器错误

我开始一个项目并开始构建它的一些结构.我将每个传感器的头文件和c ++源文件放在Arduino传感器库下的一个名为"Sensors"的文件夹中.它抱怨的文件相当小而且无趣,因为刚刚创建它.

错误:

In file included from /Applications/Arduino.app/Contents/Resources/Java/libraries/PID/../Sensors/Sensors.h:6,
             from Aircraft.h:5,
             from Aircraft.cpp:1:
/Applications/Arduino.app/Contents/Resources/Java/libraries/PID/../Sensors/Compass.h:14: error: multiple types in one declaration
Run Code Online (Sandbox Code Playgroud)

Compass.h

#pragma once

class Compass
{
private:
    double x,y,z;

public:
    void refresh();

    double getX();
    double getY();
    double getZ();
};
Run Code Online (Sandbox Code Playgroud)

它抱怨multiple types in one declaration.但该文件似乎没问题.有什么我想念的吗?我忽略了什么?

c++ arduino

0
推荐指数
1
解决办法
721
查看次数

Arduino'Hello World'打印不正确

我正在arduino uno上做一个样本问候世界.这是我的示例代码.

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  Serial.println('Hello world');
}
Run Code Online (Sandbox Code Playgroud)

这给了我串行监视器上的奇怪输出(9600 BR).我得到以下连续输出:

27748
27748
27748
Run Code Online (Sandbox Code Playgroud)

这是为什么?

arduino

0
推荐指数
1
解决办法
1441
查看次数

for循环范围问题

我使用的代码如下:

const int NUMBER_OF_FIELDS = 3;
int fieldIndex = 0;
int values[NUMBER_OF_FIELDS];

void setup()
  {
  Serial.begin(9600);
  }

void loop()
  {
   if(Serial.available())
    {
     char ch = Serial.read();
     if(ch>='0' && ch <= '9')
       {
       values[fieldIndex] = (values[fieldIndex]*10 +(ch-'0'));
       }
      else if (ch == ',')
       {
        if(fieldIndex < NUMBER_OF_FIELDS -1)
        fieldIndex++;
       }
      else 
       {
       Serial.print(fieldIndex+1);
       Serial.println("fields recieved:");
       for (int i = 0; i<=fieldIndex; i++);
         {
         //Serial.println(values[i]);
         //values[i]= 0;
         }
        fieldIndex = 0; 
       } 
    } 
  }
Run Code Online (Sandbox Code Playgroud)

但我收到的错误是:

对于'范围','i'的名称查找已更改为新的ISO'

我不认为我在for循环中做错了什么,为什么我得到这个错误?

c++ arduino

0
推荐指数
1
解决办法
2607
查看次数

安全地返回指向本地对象成员的指针

我为Arduino设备编写程序,但问题是一般的(我认为).

假设我有以下代码:

char* ClassB::generateUrl()
{
    char* someString = (char*) malloc(...);
    // something...
    return someString;
}

char* ClassA::getMyUrl()
{
    ClassB b;
    return b.generateUrl();
}

void developerMethod()
{
    ClassA a;
    char* url = a.getMyUrl();
    print(url);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,使用的开发人员ClassA::getMyUrl必须记住释放为url分配的内存.有没有更方便用户使用的方法呢? 重要提示:由于Arduino板上的内存限制,我不想返回整体ObjectB,只返回它生成的内容.并且因为它可能是长字符串,我不想将它复制到getMyUrl方法中提供的任何缓冲区作为参数.

更新:

我一定不够清楚:).我想要实现的目标:

  • 从a.getMyUrl()返回时,我不想拥有ClassB b内存
  • 从developerMethod返回时,我不希望既没有ClassA a也没有 char* url内存,没有释放.
  • 可能在字符串上使用char*

我知道在这里使用malloc是错误的,这就是为什么我问这个问题,可能摆脱malloc并且"自动"(至少从开发人员写的角度来看developerMethod)内存管理.

我想这可能很难/不可能实现,但即使这是不可能的,只要让我知道,我会接受这样的答案(如果有人在几天内确认或没有其他答案).

c++ memory return arduino

0
推荐指数
1
解决办法
166
查看次数

使用I2C发送0x00

我使用Wire类让两个Arduino Unos使用I2C进行通信.似乎Wire类以0的值结束传输.因此,如果我发送字节0x01,0x02,0x00和0x04,则主机接收:0x01,0x02,0xFF,0xFF.

设计用于处理器通信的通信网络不能发送0x00似乎很奇怪.我见过的所有I2C示例都只使用ASCII.限制为ASCII的处理器间通信似乎没有任何意义.我错过了I2C的东西,还是仅仅是Arduino Wire类的实现限制?

void loop() {
  Wire.requestFrom(2, 4); 

  while(Wire.available()) { 
    byte b = (byte) Wire.read(); 
    Serial.println(b); 
  }

  delay(1000);
}
Run Code Online (Sandbox Code Playgroud)

奴隶

void requestEvent() {
  char bytes[4] = {0x01,0x02,0x00,0x04};
  Wire.write(bytes);
}
Run Code Online (Sandbox Code Playgroud)

结果是:1 2 255 255.

当0x00是0x03时,我得到了预期:1 2 3 4.

c++ arduino i2c

0
推荐指数
1
解决办法
1766
查看次数

字符串操作很慢

我使用Delphi 7制作了一个接口软件,用于从arduino中获取数据.Arduino有3个传感器.Arduino将发送16个字符作为传感器值.例子是:

 m  0  0  .  0  1  0  0  .  0   2   0   0   .   0   3
[1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16]

[1] Flag for Start value
[2],[7],[12] are sensors status (0=disconnected, 1=connected)
[3][4][5][6] first sensor value
[8][9][10][11] second sensor value
[13][14][15][16] third sensor value
Run Code Online (Sandbox Code Playgroud)

我将arduino中的字符串值分配给名为Edit1的editText.之后我使用字符串"Copy"逐个获取传感器值.然后,传感器值将在标签中逐个显示.但标签需要很长时间才能改变价值.第一次,我认为它是由标签导致的更新缓慢.然后我用editText更改标签,但工作方式相同(仍然需要很长时间来更新值).那么有没有办法让这件事变得更快?或者字符串操作有问题?

这是我的代码:

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  Str,Buffer,Rstatus,Sstatus,Tstatus: String;
  arus : real;
  i : integer;
begin
  DecimalSeparator:='.';   
  ComPort1.ReadStr(Str, 1);
  begin
    Buffer:=Buffer + Str;
    Edit1.Text:=Edit1.Text+Str;
    if Str='m' then
    edit1.Text:='';
      if Length(Edit1.Text) >=15 then
      begin
        Rstatus:=copy(Edit1.Text,1,1);
        Sstatus:=copy(Edit1.Text,6,1);
        Tstatus:=copy(Edit1.Text,11,1);
        if …
Run Code Online (Sandbox Code Playgroud)

delphi serial-port arduino delphi-7

0
推荐指数
1
解决办法
509
查看次数

如何处理ISR回调?

我目前正在开发一个更大的Arduino Mega 2560项目; 涉及伺服控制和传感器读数.我正在使用超声波接近传感器(HC-SR04)和NewPing 1.8库,该库使用中断来检测传感器的回声.此外,我还阅读了温度和光强度测量.通过使用cmdMessenger3库,从HC-SR04超声波传感器接收的距离数据通过USB转发到主机.伺服系统由来自主机的消息使用标准伺服库控制.

一旦NewPing库调用ISR检测到超声回波的时间,就会开始乱七八糟.当距离数据可用时,这是NewPing库调用的函数:

void sendSonarData(uint8_t sensorId, uint16_t distance) {
  //noInterrupts();   
  cmdMsg3.sendCmdStart(kReadSonar);
  cmdMsg3.sendCmdArg(sensorId);
  cmdMsg3.sendCmdArg(distance);
  cmdMsg3.sendCmdEnd();
  //interrupts();
}
Run Code Online (Sandbox Code Playgroud)

这是另一个回调函数,它通过cmdMessenger3库将温度数据发送到主机:

void sendTemperatureData(uint8_t sensorId, uint16_t temperature) {
  //noInterrupts();   
  cmdMsg3.sendCmdStart(kReadTemperature);
  cmdMsg3.sendCmdArg(sensorId);
  cmdMsg3.sendCmdArg(temperature);
  cmdMsg3.sendCmdEnd();
  //interrupts();
}
Run Code Online (Sandbox Code Playgroud)

问题:当Arduino试图发送温度数据时,来自超声波传感器的ISR可能会跳入并将其自己的数据写入串行流; 关于发送到主机的串行数据一团糟,因为发送过程不是原子的,由多个命令组成,用于发送一条消息(sendCmdStart- > sendCmdArg- > sendCmdEnd).

这是一个例子:

  1. 读取温度sendTemperatureData(...)称为温度
  2. cmdMsg3.sendCmdStart(kReadTemperature); 叫做
  3. cmdMsg3.sendCmdArg(sensorId); 叫做
  4. 来自声纳传感器的ISR跳入
  5. sendTemperatureData(); 叫做
  6. cmdMsg3.sendCmdStart(kReadSonar); 叫做
  7. cmdMsg3.sendCmdArg(sensorId);
  8. cmdMsg3.sendCmdArg(distance);
  9. cmdMsg3.sendCmdEnd();
  10. 其余的陈述sendTemperatureData(...)被称为
  11. cmdMsg3.sendCmdArg(temperature);
  12. cmdMsg3.sendCmdEnd();
  13. 导致串口通信大乱...

然后,我试图通过使用在发送过程中阻止ISR调用noInterrupts()/interrupts(); 使发送过程有点'原子'.但这导致了许多其他问题,millis()/micros()功能不再精确,串行通信发生故障等; 所有都依赖于被禁用的计时器 …

arduino interrupt interrupt-handling

0
推荐指数
1
解决办法
336
查看次数

如何将此整数拆分为其原始值?

创建RGB数的公式是:

R (value between 0-100) + G (value between 0-100) * 1000 + B (value between 0-100) * 1000000
Run Code Online (Sandbox Code Playgroud)

这导致类似于:8017035

如何将此值转换回其原始的3个变量值?

使用和esp8266运行此代码

c++ arduino

0
推荐指数
1
解决办法
74
查看次数

如何从指向指针数组的指针中删除对象?

我仍然不熟悉C ++中的手动销毁(来自具有垃圾回收功能的语言)。我的一门课有以下内容:

Input** Inputs;

初始化如下:

this->Inputs = new Input* [totalInputs];

并可以根据用户输入稍后在我的代码中重新分配,类似于:

this->Inputs[inputNumber] = new DigitalInput(params...)

问题在于,由于释放旧对象,在该位置重新分配对象时,它很容易发生内存泄漏。

重新分配旧对象后,删除旧对象的最佳方法是什么?

编辑:我忘了包括在Arduino代码库上运行的AVR微控制器上。

编辑2:之所以这样做,是因为允许用户将命令发送到将更改输入类型的单元(即:发送命令和this->Inputs[inputNumber] = new AnalogInput(params...)。这也是指向指针数组的指针)的原因。这是因为此对象的构造函数将根据totalInputs传入的参数生成该数组。这在一个共享库中使用,该共享库可在几个不同的单元上使用。

c++ pointers arduino destruction

0
推荐指数
1
解决办法
74
查看次数