【问题标题】:Arduino - Serial Communication - error in the codeArduino - 串行通信 - 代码错误
【发布时间】:2018-10-12 16:34:28
【问题描述】:

我的目标是制作一个能够使用 NodeMcu esp 8266 控制一个简单系统的项目,通过另一个 C# 中的简单 Windows 窗体应用程序。
但是我的代码有一些错误,我不知道为什么。所以我想有人帮我做这件事。

错误:

  1. 当我将位置发送到伺服器时,他只工作一次,而且每次都在同一个位置。
  2. 当我将命令发送到灯泡关闭时,只有其中一个有效。
  3. 只是蜂鸣器按我的意愿工作

这是Arduino代码:
// Programação do controle de dispositivos via Serial com ESP8266

#include <Servo.h>
// #include <Process.h>

Servo servo;

const int buzzer = D2;
const int lamp1 = D4;
const int lamp2 = D0;
const int pinServo = D3;

String serialData;

// String comando;

bool estadoBuzzer = LOW;
bool estadoLam1 = LOW;
bool estadoLam2 = LOW;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  //SerialUSB.begin(115200);
  pinMode(buzzer, OUTPUT);
  pinMode(lamp1, OUTPUT);
  pinMode(lamp2, OUTPUT);
  servo.attach(pinServo);
  Serial.setTimeout(10);
  //Bridge.begin();
  //while (!SerialUSB);
}

void loop() {
  // put your main code here, to run repeatedly:
  serialEvent(Serial.readString());
}

void serialEvent(String data){
  /*Process p;
  comando = "echo " + data + " > teste_arduino_serial_comandos.txt";
  p.runShellCommand(comando);
  */
  if(data.charAt(0) == 'B'){
    if(estadoBuzzer == HIGH){
      digitalWrite(buzzer, LOW);
      estadoBuzzer = LOW;
    } else {
      digitalWrite(buzzer, HIGH);
      estadoBuzzer = HIGH;
    }
  } else if(data.charAt(0) == 'L'){
    data.remove(0);
    if(data.toInt() == 1){
      lampada1();
    } else {
      lampada2();
    }
  } else if(data.charAt(0) == 'A'){
    data.remove(0);
    int angulo = data.toInt();
    Serial.println(angulo);
    if(angulo >= 0 && angulo <= 180){
      servo.write(angulo);
    }
  }
}

void lampada1(){
  if(estadoLam1 == HIGH){
     digitalWrite(lamp1, LOW);
     estadoLam1 = LOW;
  } else {
     digitalWrite(lamp1, HIGH);
     estadoLam1 = HIGH;
  }
}

void lampada2(){
  if(estadoLam2 == HIGH){
     digitalWrite(lamp2, LOW);
     estadoLam2 = LOW;
  }
  else {
     digitalWrite(lamp2, HIGH);
     estadoLam2 = HIGH;
  }
}

这里是 C# 代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Diagnostics;

namespace ControleDeDispositivosViaSerialNodeMcuEsp8266
{
    public partial class Form1 : Form
    {
        public Stopwatch watch { get; set; }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            watch = Stopwatch.StartNew();
            port.Open();
        }
        public void writeToPort(String indicador, String valor="0")
        {

            if (watch.ElapsedMilliseconds > 15)
            {
                watch = Stopwatch.StartNew();

                port.Write(String.Format(indicador+valor));

                System.Windows.Forms.MessageBox.Show(indicador + valor);

            }
            // System.Windows.Forms.MessageBox.Show(port.ReadExisting());
        }

        private void anguloBtn_Click(object sender, EventArgs e)
        {

            writeToPort("A", angulos.Text);
            angulos.Refresh();

        }

        private void onoff1_Click(object sender, EventArgs e)
        {
            writeToPort("L", "1");
        }

        private void onoff2_Click(object sender, EventArgs e)
        {
            writeToPort("L", "2");
        }

        private void buzzerBtn_Click(object sender, EventArgs e)
        {
            writeToPort("B");
        }
    }
}

【问题讨论】:

  • 字符串是一种变量
  • 哦,现在我明白了.... C中的字符串“不存在”,但是当我们在Arduino中使用字符串时,它不起作用,所以我们必须使用字符串
  • 也许 readString 在只读取第一个字符后返回。也许你应该发送一个长度然后循环直到你收到所有数据(自从我写任何 arduino 代码以来很长时间)(或者总是发送,比如 4 个字符)

标签: c# arduino esp8266 nodemcu arduino-esp8266


【解决方案1】:

你的 data.toInt() 不工作,这就是为什么它总是只有一个灯和伺服上的相同位置。

data.Remove(0) 在第一个字符之后删除所有内容,因此将为空。

使用数据 = 数据。子串(1)

我通常做的反馈检查是写:Serial.println(data) etc检查我是否真的使用我认为我拥有的东西。

【讨论】:

  • 非常感谢,虽然我的问题还没有解决。 . .但是你帮了几个大忙。 .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多