c# - Arduino - 串行通信 - 代码错误
问题描述
我的目标是通过另一个简单的 C# Windows 窗体应用程序制作一个能够使用 NodeMcu esp 8266 控制简单系统的项目。
但是我的代码有一些错误,我不知道为什么。所以我想有人帮我做这件事。
错误:
- 当我将位置发送到伺服器时,他只工作一次,而且每次都在同一个位置。
- 当我将命令发送到灯泡关闭时,其中只有一个有效。
- 只是蜂鸣器按我的意愿工作
这是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");
}
}
}
解决方案
你的 data.toInt() 不工作,这就是为什么它总是只有一盏灯并且在伺服器上的相同位置。
data.Remove(0) 在第一个字符之后删除所有内容,因此将为空。
使用数据 = 数据。子串(1)
我通常做的反馈检查是写:Serial.println(data) etc检查我是否真的使用我认为我拥有的东西。
推荐阅读
- reactjs - 将道具添加到作为道具传递的组件
- elasticsearch - 如何构建一个后向边缘 n-gram 分词器
- django - 检查 url 状态而不打开它
- python - 从另一个运行 FTP 下载的线程更新 PyQt 进度
- c++ - 是否可以更改类成员缓冲区的大小
- jquery - 如何在 jquery 中添加类引用所以我悬停只在我的菜单中工作而不是到处
- c# - 将代码组织成新解决方案后的调试器跳过方法
- android - 找不到类 [org/drinkless/td/libcore/telegram/TdApi$Object]
- nuxeo - 如何卸载 Nuxeo Studio 安装的软件包?
- mysql - 我无法为迁移创建新表