当前位置: 首页 > 知识库问答 >
问题:

在arduino上尝试使用字符串和串行端口时,我的草图出于某种原因跳过了字符

朱啸
2023-03-14

我一直在尝试在基于arduino的项目和我的pc之间实现串行通信,我需要通过串行向arduino发送命令,并使用“if and else”调用所需的函数(在parseMessage()函数中)。

我不能使用delay(),因为我使用中断进行多路复用和位角调制,所以我必须以另一种方式进行串行通信,这是我最接近成功的方式,但总体而言,我仍然会遇到字符跳跃和不稳定。正如你所知,除了你不知道自己的代码出了什么问题之外,编码是非常棒的,所以请帮助我,请诸位互联网之神!;)

我之所以使用“#”作为html" target="_blank">字符串清除的结尾,是因为我不能确定发送给arduino的命令中的所有字符在串行时都在那里。read()需要它,因为atmega328比串行端口串行速度快,所以可能会有更多。available()可能在传输过程中实际返回-1。

>

  • ps:哦,我不能使用字符串类,它非常昂贵,这个atmega328已经在8x8 RGBLED多路复用和4位角度调制下汗流浃背,他将来还得做更多。

    ps:我还在学英语,所以如果我用的语法有问题,请原谅。

    void setup() {
    Serial.begin(9600);
    }
    
    bool dataRTP = false; // data ready to parse
    
    void loop() {
      readSerial();
    }
    
    char message[64];
    int index = 0;
    
    void readSerial() {
      if (Serial.available() > 0)
        while (Serial.available() > 0)
          if (Serial.peek() != '#') // i'm using '#' as end of string declearation.
            message[index++] = Serial.read();
          else {
            message[index++] = '\n';
            dataRTP = true;
            break;
          }
      while (Serial.read() != -1) {} // flushing any possible characters off of
      if (dataRTP)                                              // UARTS buffer.
        parseMessage();
    }
    
    void parseMessage() {            // just testing here, actual code would be like :
      Serial.print(message);         // if (!strcmp(message, "this expression"))
      index = 0;                     //  callthisfunction();
      dataRTP = false;               // else ... etc
    }
    
  • 共有1个答案

    太叔鸿博
    2023-03-14

    刚刚设法修复了这段代码,似乎从串行通用异步收发设备上冲洗数据并不是一个好主意。都解决了。下面是代码现在的样子:

      void setup() {
          Serial.begin(9600);
        }
    
        bool dataRTP = false;
    
        void loop() {
          readSerial();
        }
    
        char message[64];
        int index = 0;
    
        void readSerial() {
          if (Serial.available() > 0)
            while (Serial.available() > 0)
              if (Serial.peek() == '#') {
                message[index++] = Serial.read();
                message[index++] = '\0';
                dataRTP = true;
                break;
              }
              else
                message[index++] = Serial.read();
          if (dataRTP)
            parseMessage();
        }
    
        void parseMessage() {
          Serial.println(message);
          index = 0;
          dataRTP = false;
        }
    
     类似资料:
    • 我尝试从长字符串中获取字符串,该字符串是Firebase URL 现在,如果您注意到上面字符串中姓名朱利安之前和之后的分数不足。我试图得到这个名字,但我正在得到 这是我的代码

    • 我正在和两个阿杜伊诺斯·莱昂纳多做一个通讯系统。为了传输,我必须将字符串转换成比特,并通过PWM引脚发送。问题是,我该怎么做接收器? 我的想法是在数字引脚中接收数据,这样我就可以将LOW/HIGH转换为'0'和'1',将8位放在字符串中,转换为char,然后我就有了最后的字符串。 如有任何帮助/建议,将不胜感激。 编辑: 我使用PWM是因为我想实现FSK调制,一点一点地发送 我有一些硬件来让通讯系

    • 字符串用于存储文本。 它们可用于在LCD或Arduino IDE串行监视器窗口中显示文本。 字符串对于存储用户输入也很有用。 例如,用户在连接到Arduino的键盘上键入的字符。 Arduino编程中有两种类型的字符串 - 字符数组,与C编程中使用的字符串相同。 Arduino String,它允许我们在草图中使用字符串对象。 在本章中,我们将学习字符串,对象以及Arduino草图中字符串的使用。

    • 问题内容: 我的程序将覆盖以使用 现在someString可能会很长,因此可能不适合一行。 在多行上编写文本的最佳方法是什么。 例如,在矩形(x1,y1,x2,y2)中? 问题答案: 感谢Epaga的提示和网上的一些示例(查找起来并不那么明显!我主要使用Break Line作为文本布局 ),我可以制作一个组件来显示包装的文本。它是不完整的,但至少可以显示预期的效果。 只是为了好玩,我使它适合一个圆

    • 获取输入字符串,将其反转并用“-”进行解析: 输入:计算机 输出: 为什么这段代码会出现错误,以及如何删除错误? 出现以下错误: 主要的java:3:错误:类ClassSet15是公共的,应该在名为ClassSet15的文件中声明。java公共类ClassSet15{^1错误

    • 这是我的密码 没有语法错误,但是我的Jtag没有添加(按钮工作正常)。我不想从null更改布局,因为我希望能够定义按钮和标签的位置。有人知道为什么这行不通吗?