正确实现C#<-> Arduino串行通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正确实现C#<-> Arduino串行通信相关的知识,希望对你有一定的参考价值。

我正在尝试通过C#程序通过串行与Arduino来回通信。 我有一个基本的工作示例,但是它不是很漂亮,也不是没有缺陷。 我已经在最后添加了它。 我已经在网上进行了一些研究,但是当您不知道所寻找内容的所有细节和复杂性时,很难找到一些东西。

我觉得良好的串行通信协议应该包括握手,发送数据和等待响应,接收数据和发送响应,数据时钟等。我的问题是如何最好地实现这一点。 我现有的代码是单向的,从C#到arduino的串行端口,并且它只是发送数据并假定已接收到数据。 这也非常简单,只发送两个字节(1或0可以打开或关闭LED,0-255可以通过PWM控制LED的亮度)。 我希望能够从arduino发送到程序,然后发送传感器数据或确认已接收并执行了数据。

我也很好奇同步。 这与握手并驾齐驱吗(无双关语)? 如何以任何一种方式可靠地发送数据,并确保不会因不同步而丢失任何内容?

任何人,我已经漫步了,对不起。 希望有人可以对此主题有所了解。 这是我当前的混乱代码:

Arduino的:

#define LEDPin 9
byte SerialCmd = 0;
byte SerialVal = 0;

void setup() {
  Serial.begin(9600);
  pinMode(LEDPin, OUTPUT);
  digitalWrite(LEDPin, LOW);
}

void loop() {
  while(Serial.available() > 1) {
    SerialCmd = Serial.read();
    SerialVal = Serial.read();
    switch(SerialCmd) {
      case 0:
        digitalWrite(LEDPin, LOW);
        break;
      case 1:
        analogWrite(LEDPin, SerialVal);
        break;
    }
  }
}

C#:

using System;
using System.Windows.Forms;

namespace ArduinoTest2
{
    public partial class Form1 : Form
    {
        byte[] SerialData = new byte[] { 0, 0 };

        public Form1()
        {
            InitializeComponent();
            serialPort1.PortName = "COM3";
            serialPort1.BaudRate = 9600;
            serialPort1.Open();
        }

        public void SerialWrite()
        {
            serialPort1.Write(SerialData, 0, 2);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SerialData[0] = 1;
            SerialWrite();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            SerialData[0] = 0;
            SerialWrite();
        }

        private void trackBar1_Scroll(object sender, EventArgs e)
        {
            SerialData[1] = Convert.ToByte(trackBar1.Value);
            label1.Text = trackBar1.Value.ToString();
            SerialWrite();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            serialPort1.Close();
        }
    }
}

以上是关于正确实现C#<-> Arduino串行通信的主要内容,如果未能解决你的问题,请参考以下文章

使撇号在 perldoc 中正确呈现

使用 PCRE 正则表达式匹配两个二进制数的正确加法

C语言实现:键盘输入三个数字,输出最大值

Java中字段类型实现的接口通用信息

note2

用递归的方法实现判断回文字符c语言