正确实施C#< - > Arduino串口通讯

时间:2016-12-09 18:12:09

标签: c# serialization arduino

我正试图通过C#程序通过串口来回传递Arduino。我有一个基本的工作示例,但它不漂亮而且没有错误。我把它包括在最后。我已经在网上做了一些研究,但是如果你不了解你所寻找的所有细节和错综复杂的内容,就很难找到。

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

我也对同步感到好奇。这是否与握手齐头并进(没有双关语)?如何以可靠的方式发送数据,并确保不会因为不同步而丢失任何内容?

Anywho,我絮絮叨叨,抱歉。希望有人能够对这个问题有所了解。这是我目前凌乱的代码:

的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();
        }
    }
}

0 个答案:

没有答案