正确实现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串行通信的主要内容,如果未能解决你的问题,请参考以下文章