PHP переполняет буфер arduino - PullRequest
1 голос
/ 11 марта 2020

У меня проблема с переполнением буфера в arduino (uno). Я пытаюсь создать простое приложение, в котором я вставляю b (синий диод) или r (красный диод) или пробел (пробел не включает диод) через страницу PHP в форму, отправляю его, а затем синий или загорается красный диод. Arduino подключен через USB (COM3) В частности: я вставляю "br rb rbrb" в текстовое поле, первые 9 символов отображаются диодным светом, но после того, как буфер девятого символа arduina, вероятно, заполнен, а другие символы отображаются (диодами) примерно через 10 секунд. Если кто-нибудь знает, как это исправить, я хотел бы поблагодарить вас.

Кстати, если я использую последовательный монитор в приложении Arduino, эта проблема не возникает, и буфер не заполняется, поэтому Arduino будет обрабатывать всю строку ("br rb rbrb ") без помех на девятом символе

код Arduino:

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 код:

<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>

1 Ответ

0 голосов
/ 11 марта 2020

Ваши delay(500); вызовы запрещают чтение более 2 символов в секунду.

Существует несколько способов улучшить это поведение.

Имейте в виду, что входной буфер Uno Serial очень ограничен (64 символа).

Если при отправке, например, "br rb rbrb" (11 символов), временной ряд превышает 5 секунд, отправителю следует просто подождать достаточно долго, прежде чем отправлять следующую последовательность (проще всего вручную).

Однако описание вашей проблемы переполнения не совсем подходит (вы отправляете меньше, чем buffer_size = 64 символа?). Пожалуйста, посмотрите поближе.

...