繁体   English   中英

使用strncmp函数的Arduino IDE中的错误

[英]Error in Arduino IDE using strncmp function

我正在使用以下代码来比较两个字符串并得到错误:

>  #define _EXFUN(name, proto)  name proto
> 
>                               ^
> 
> exit status 1 invalid conversion from 'char' to 'const char*'
> [-fpermissive]

据我了解strncmp函数正在寻找'const char *',但是当我将'chat'转换为'const char *'时,我在串行监视器中得到了奇怪的结果:

> Exception (28): epc1=0x40209035 epc2=0x00000000 epc3=0x00000000
> excvaddr=0x00000030 depc=0x00000000
> 
> ctx: cont  sp: 3ffffda0 end: 3fffffd0 offset: 01a0
> 
> >>>stack>>> 3fffff40:  40100fee 3ffe8c3c 000026fe 00000000   3fffff50:  401011c4 000026fe 3ffee75c 00000000   3fffff60:  3ffe8c70 3ffee75c
> 3ffe850c 3ffee75c   3fffff70:  3ffee6e0 3ffee7c8 40202fe8 3fffefb0  
> 3fffff80:  402014ce 00000001 00000001 402014c3   3fffff90:  00002580
> 3ffee6dc 00000014 4020292c   3fffffa0:  feefeffe 00000000 3ffee7c0
> 3ffee7c8   3fffffb0:  3fffdad0 00000000 3ffee7c0 40203074   3fffffc0: 
> feefeffe feefeffe 3ffe850c 401000e5   <<<stack<<< ?)⸮

代码本身:

#include <Wire.h>
#define I2C_ESP_ADDRESS 8
int count=0;
char model;
char reading;
char incoming;

void setup()
{
    Serial.begin(9600);
    Wire.begin(5,4);//Change to Wire.begin() for non ESP.
    /*model[0] = "e";
    model[1] = "0";
    for (int i = 1; i < 20; i++) {
        model[i] = 0;
    }*/
}

void loop()
{     
    Wire.requestFrom(I2C_ESP_ADDRESS,20);
    while (Wire.available())
    {
        delay(1);
        incoming = Wire.read();

        if (strncmp(incoming,"elxxxxxxxxxxxxxxxxxx",2) == 1 ) {
            model = incoming;
        } else { 
            reading = incoming;
        }
    }
}

在Arduino上, Wire.read()仅读取一个字节char )。

strncmp想要比较两个以零结尾的字符串( const char * ),并且实际上并没有处理单个字符,这就是为什么会出现编译器错误的原因:它告诉您不能将char像对待const char *

当您通过强制转换为const char *来强制执行此操作时,它将单个字节的值视为指针,并且strncmp读取内存中可能不应该存在的位置(无论该地址位于由指针给定的地址处)字节的值)。 这会导致您看到的崩溃。

从根本上说,这里的字符串 (一个字节序列的末尾有一个空字节)和字符 (只是一个字节)之间似乎有一些混淆。 在内存中,差异如下所示:

          +----+
char '*': | 42 |
          +----+

              +----+----+----+----+
string "***": | 42 | 42 | 42 |  0 |
              +----+----+----+----+

当前incomingmodel都只能容纳一个字符。 如果要存储多个字符,请考虑使用一个数组( char incoming[SIZE] ,其中SIZE是数据的最大大小)。

然后,您可以将传入的字节写入数组中的后续位置,并最终像以前一样使用strncmp一次比较整个字符串。

如果您只想比较incoming == 'x'各个字节,则直接比较它们( incoming == 'x' ),或者跟踪比较字符串中的索引,在每次不匹配时将其重置为零。

所以这是对我有用的正确代码:

void loop() {

 Wire.requestFrom(I2C_ESP_ADDRESS,18);
 while (Wire.available()){



 incoming = Wire.read();
Serial.print(incoming);
 //Serial.print(incoming);

 //sprintf (incomingArray, "%.20", incoming);

  if ( incoming == 'e') {
    modelArray[0] = 'e';


    for (int i = 1; i < 18; i++ ){
      modelArray[i] = (char) Wire.read();
      Serial.print(modelArray[i-1]);
    }
  } 



    if ( incoming == 'a') {
    readingArray[0] = 'a';
   // Serial.print("Got Reading: ");

    for (int j = 1; j < 18; j++ ){
      readingArray[j] = (char) Wire.read();
      Serial.print(readingArray[j-1]);
    }

    Serial.println();

    }


}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM