我有以下数组:
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传感器库下的一个名为"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.但该文件似乎没问题.有什么我想念的吗?我忽略了什么?
我正在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)
这是为什么?
我使用的代码如下:
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循环中做错了什么,为什么我得到这个错误?
我为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方法中提供的任何缓冲区作为参数.
更新:
我一定不够清楚:).我想要实现的目标:
ClassB b内存ClassA a也没有 char* url内存,没有释放.我知道在这里使用malloc是错误的,这就是为什么我问这个问题,可能摆脱malloc并且"自动"(至少从开发人员写的角度来看developerMethod)内存管理.
我想这可能很难/不可能实现,但即使这是不可能的,只要让我知道,我会接受这样的答案(如果有人在几天内确认或没有其他答案).
我使用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.
我使用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) 我目前正在开发一个更大的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).
这是一个例子:
sendTemperatureData(...)称为温度cmdMsg3.sendCmdStart(kReadTemperature); 叫做cmdMsg3.sendCmdArg(sensorId); 叫做sendTemperatureData(); 叫做cmdMsg3.sendCmdStart(kReadSonar); 叫做cmdMsg3.sendCmdArg(sensorId);cmdMsg3.sendCmdArg(distance);cmdMsg3.sendCmdEnd();sendTemperatureData(...)被称为cmdMsg3.sendCmdArg(temperature);cmdMsg3.sendCmdEnd();然后,我试图通过使用在发送过程中阻止ISR调用noInterrupts()/interrupts(); 使发送过程有点'原子'.但这导致了许多其他问题,millis()/micros()功能不再精确,串行通信发生故障等; 所有都依赖于被禁用的计时器 …
创建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 ++中的手动销毁(来自具有垃圾回收功能的语言)。我的一门课有以下内容:
Input** Inputs;
初始化如下:
this->Inputs = new Input* [totalInputs];
并可以根据用户输入稍后在我的代码中重新分配,类似于:
this->Inputs[inputNumber] = new DigitalInput(params...)
问题在于,由于释放旧对象,在该位置重新分配对象时,它很容易发生内存泄漏。
重新分配旧对象后,删除旧对象的最佳方法是什么?
编辑:我忘了包括在Arduino代码库上运行的AVR微控制器上。
编辑2:之所以这样做,是因为允许用户将命令发送到将更改输入类型的单元(即:发送命令和this->Inputs[inputNumber] = new AnalogInput(params...)。这也是指向指针数组的指针)的原因。这是因为此对象的构造函数将根据totalInputs传入的参数生成该数组。这在一个共享库中使用,该共享库可在几个不同的单元上使用。