【问题标题】:if (indata[0] == '10') does not work [closed]如果(indata [0] =='10')不起作用[关闭]
【发布时间】:2014-08-02 06:02:41
【问题描述】:

这几天我一直在编写一些 arduino 代码,但我遇到了这个问题。我需要检查 inData 是否等于最大 150 的数字,但是当我输入两位数和三位数时它停止工作。这是我正在使用的代码。它从键盘输入数字,该键盘设置为将其数字发送到 arduino 的串行 RX 引脚。

放在这里太长所以我把它放在pastebin here

char inData[20]; // Allocate some space for the string
if (inData[0] == '10') {
// Code snipped for brevity
}

【问题讨论】:

  • 很多人(包括我在内)不会去“场外”查看您的代码。 indata是什么类型的?
  • '10'不是一个字符。
  • while (Serial.available()) { delay(10);字符 c = Serial.read(); if (c == ',') {break;} readString += c; if (readString == "#") {look();读字符串="";休息; } inData[索引] = c;索引++; inData[index] = '\0';
  • @timrau:不,但它很短。这是比较 2 个字符的最快和最简单的方法:*(WORD*)inData == '01'。我假设英特尔架构,所以你必须通过反转短的数字来补偿字节序。

标签: c++ if-statement char arduino


【解决方案1】:

假设inData,一个char 数组,是一个C 风格,'\0' 终止的字符串。那么你应该做的是调用strcmp() 而不是只比较 1st 字符。

#include <cstring>

if (std::strcmp(inData, "1") == 0) {
}
else if (std::strcmp(inData, "2") == 0) {
}
//...
else if (std::strcmp(inData, "10") == 0) {
}

请注意'' 带引号的字符文字和"" 带引号的字符串文字之间的区别。

【讨论】:

  • 把这个转成int,然后只比较,而不是多次strcmp不是更有效吗?
  • @JamesBlack 好点。 atoi()sscanf() + switch
【解决方案2】:

我发现了几个问题。

首先,使用if..then..else 构造或多个if..then 语句的开关。

而且,当您与 char 进行比较时,10 是两个 char 值,因此简单的 == 不起作用。

您可以先将其转换为整数,使用atoi 然后进行比较,或者您可以查看if (inData[0] == '1' &amp;&amp; inData[1] == '0') 会做您想做的事情。

更新:

我会确保首先将 inData 的每个部分设置为零,而不是“0”。

然后使用一个开关,比如这样的:

switch(inData[0]) {
  case '1':
    switch(inData[1]) {
       case 0:
         // This would be '1'
         break;
       case '0':
         // This will be 10
         break;
    }
    break;
  case '2':
     break;
}

这段代码我没有测试过,只是作为例子。

【讨论】:

  • 我刚刚在我的代码中添加了 'if (inData[0] == '1' && inData[1] == '0')' 来使用它,但是当我输入 10 时它就出现了作为 1.
  • 当我输入 10 时,它显示 1 比 10 多,所以它仍在拾取 1
  • 您需要颠倒顺序,并使用 if..then..else,因此在较小的数字之前查找较大的数字。
  • 好吧,我会试试看
  • 你能给我一个例子来说明如何使用 if...then...else 吗?
【解决方案3】:

如果是 C++,你应该使用 std::string

std::string inData; // Allocate some space for the string

// Replace this:
// inData[index] = c;
// index++;
// inData[index] = '\0';   

// with
inData += c;

if (inData == "10") {   // Test for a specific string.

【讨论】:

  • 我的代码是用于 arduinoIDE
  • @user3732307:那么问题不在于 C++ 吗?还是IDE不支持标准库?
  • 我不知道 arduino 来自什么代码,但我知道 std::string inData;不要在里面工作。
  • @user3732307:你在文件顶部有#include &lt;string&gt;吗?
  • idk 但我知道这对我不起作用,但谢谢。
猜你喜欢
  • 2018-08-02
  • 2016-07-03
  • 2020-05-18
  • 1970-01-01
  • 2013-02-10
  • 2014-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多