如何将串行输入存储在char数组arduino中?

Posted

技术标签:

【中文标题】如何将串行输入存储在char数组arduino中?【英文标题】:How to store serial inputs in an char array arduino? 【发布时间】:2020-04-09 14:39:55 【问题描述】:

我的目标是在 2 个指定字符之间获取 char 数组的某些部分。下面的代码完美运行,并按我的预期返回 0037。但是,我想让它不仅可用于 char*s 的串行输入。换句话说,如果我将“123123123!0037sjd#asdasdasd”写入串行,代码应该再次以相同的方式工作。

我该怎么做?

const char *s = "123123123!0037sjd#asdasdasd";
const char *CHAR1 = "!";
const char *CHAR2 = "#";
char *target = NULL;
char *start, *end;

void setup() 
  Serial.begin(9600);


void loop() 
  //s=(char)Serial.read();
  if (start = strstr(s, CHAR1)) 
    start += strlen(CHAR1);
    if (end = strstr(start, CHAR2)) 
      target = (char*) malloc(end - start + 1);
      memcpy(target, start, end - start);
      target[end - start] = '\0';
    
  
  if (target) 
    for (int i = 0; i < 4; i++) 
      Serial.print(target[i]);
    
    target = "";
    free(target);
  
  target = "";
  free(target);

【问题讨论】:

要使用您已有的代码,您需要将接收到的字节存储在char 缓冲区中,您需要附加一个空终止符(搜索词:“c-style string "),您需要定义您可以在串行上接收到的最大字节长度,您需要定义您的程序如何知道串行上的字节序列已经结束(结束字符,将长度写为第一个字节,或者只是等待读取操作超时),并且您需要定义程序在接收到比它可以处理的更长的字节序列时要执行的操作。之后你就可以使用你拥有的代码了。 你能用这种方式编辑我的代码吗?因为我对此很陌生。我必须使用 char 数组而不是字符串。 为什么一定要用char数组而不是Stringstd::string 我的第一条评论描述了定义协议。它不是从代码开始的。它从笔和纸开始。您需要设计计算机和 arduino 之间的通信规则。只有在您定义了这些规则之后,您才能实施它们(编码它们)。该规则可以像“计算机只会发送正好 10 个字符”一样简单,但您仍然需要该规则。这取决于你想做什么。 “c 样式字符串”只是一个以空字符结尾的字符数组。 【参考方案1】:

分配丢失原始分配。

代码错误地释放了一些未分配的东西。

// Bad
target="";        // loses prior allocation
free( target );   // Attempts to free something not allocated

相反

free( target );
target = NULL;

【讨论】:

我这样写的时候,0037就无限了 @ReduXCompletedy 很可能您只将此修复应用于代码中 2 个位置中的 1 个。【参考方案2】:

为了解析这样的串行流,也许只使用一个标志。从清除标志开始。当你看到 ! 时设置标志。在设置标志的同时输入数字时,将它们存储在数组中。当你看到不是数字的东西时,清除标志。

如果最终结果是这样的话,您甚至可以动态累积整数中的数字(跳过数组)。

就我个人而言,我在 Arduino 上不使用 malloc/free,这里也不需要。

HTH!

【讨论】:

以上是关于如何将串行输入存储在char数组arduino中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将无符号字符数组存储为浮点值?

通过串行读取 utf8 时,Arduino 行为异常

arduino中char item是啥意思

从 php 到 arduino 的串行通信

串行python到arduino

将串行数据发送到 arduino 可以在串行监视器中使用,但不能在 python 中使用