首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP溢出arduino缓冲区

PHP溢出arduino缓冲区
EN

Stack Overflow用户
提问于 2020-03-11 13:19:28
回答 1查看 74关注 0票数 2

我对arduino (uno)缓冲区溢出有问题。我试图创建一个简单的应用程序,在其中我插入b(蓝色二极管)或r(红色二极管)或空格(空格不打开任何二极管)通过PHP页面进入表单,发送它,然后蓝色或红色二极管亮起。Arduino通过USB (COM3)连接:我将"br b rbrb“插入文本区域,前9个字符通过二极管灯显示,但在第九个字符arduina缓冲区可能被填充之后,其他字符在大约10秒后被显示(由二极管显示)。如果有人知道怎么修的话,我想谢谢你。

顺便说一句,如果我在arduino应用程序中使用串行监视器,这个问题就不是,缓冲区也不会填满,因此arduino将处理整个字符串("br b rbrb"),而不会干扰第九个字符。

Arduino代码:

代码语言:javascript
运行
复制
int red_2=4;
int blue_1=5;

void setup() {
  Serial.begin(9600);

  // set diodes for outputs
  pinMode(red_2, OUTPUT); // red
  pinMode(blue_1, OUTPUT); // blue


  //all diodes going LOW in start
  digitalWrite(red_2, LOW);
  digitalWrite(blue_1, LOW);

}

void loop() {
  char var_characters;


  if (Serial.available() > 0) {
    var_characters = Serial.read();

    if (var_characters == ' ') {
      Serial.println("Reading charakter: 'space' ");
      delay(500);
      digitalWrite(red_2, LOW);
      digitalWrite(blue_1, LOW);
    }

    if (var_characters == 'b') {
      digitalWrite(blue_1, HIGH);
      Serial.print("Reading charakter: ");
      Serial.println(var_characters);
      delay(500);
      digitalWrite(blue_1, LOW);
    }

    if (var_characters == 'r') {
      digitalWrite(red_2, HIGH);
      Serial.print("Reading charakter: ");
      Serial.println(var_characters);
      delay(500);
      digitalWrite(red_2, LOW);
    }
  }
} 

PHP代码:

代码语言:javascript
运行
复制
<html>
<head>
    <title>PHP and Arduino</title>
</head>
<body>
    <?php
        exec("mode COM3: BAUD=9600 PARITY=n DATA=8 STOP=1 to=off dtr=off rts=off");
        $port = fopen("COM3", "w+");
        sleep(2);
    ?>

    <center>
        <h1>PHP and Arduino</h1>

        <form method="post">
            Message: <textarea type="text" name="msg_form"></textarea>
            <input type="submit" name="send1">
        </form>

        <br>
    </center>

    <?php
        if (isset($_POST['send1'])) {

            $msg_post = $_POST['msg_form'];

            echo "<center> $msg_post </center>";
            fwrite($port, "$msg_post");
        }

        fclose($port);
    ?>
</body>
</html>
EN

回答 1

Stack Overflow用户

发布于 2020-03-11 13:46:42

您的delay(500);调用禁止每秒读取两个以上字符。

有几种方法可以改善这种行为。

请记住,Uno串行输入缓冲区非常有限(64 char)。

如果发送例如"br b rbrb“(11个字符)的时间序列超过5秒,则发送方只需等待足够长的时间就可以发送下一个序列(最简单的手动发送)。

但是,您的溢出问题描述并不适合(发送的buffer_size小于64 char ?)。请仔细看看。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60637030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档