我正试图通过C#程序通过串口来回传递Arduino。我有一个基本的工作示例,但它不漂亮而且没有错误。我把它包括在最后。我已经在网上做了一些研究,但是如果你不了解你所寻找的所有细节和错综复杂的内容,就很难找到。
我的印象是良好的串行通信协议应包括握手,发送数据并等待响应,接收数据和发送响应,数据时钟等。我的问题是如何最好地实现这一点。我现有的代码是单向的,从C#到arduino的串口,它只发送数据并假定它已被接收。它也非常简单,只发送两个字节(1或0打开或关闭LED,0-255通过PWM控制LED的亮度)。我希望能够发送传感器数据或确认数据已被接收和执行,从arduino返回到程序。
我也对同步感到好奇。这是否与握手齐头并进(没有双关语)?如何以可靠的方式发送数据,并确保不会因为不同步而丢失任何内容?
Anywho,我絮絮叨叨,抱歉。希望有人能够对这个问题有所了解。这是我目前凌乱的代码:
#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;
}
}
}
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();
}
}
}