20

您好,我是使用 USB 连接控制硬件的新手。我有一个 Arduino UNO 微控制器,正在寻找资源让我开始。我用 C# (Visual Studio 2010) 编程,想知道是否有一些基础知识可以用来设置/测试我的连接。我正在寻找一个简单的东西,比如我的 WinForm 中的一个复选框,可以在高低之间切换 Arduino 上的数字 I/O 引脚。一直找不到太多的开始。

提前致谢。

4

4 回答 4

13

有很多方法可以将命令从 pc 发送到 arduino。Sandeep Bansil 提供了一个连接和读取串行端口的好例子。

下面是一个工作示例,说明如何根据 Windows 表单上的复选框状态写入串行端口以及如何在 arduino 上处理来自 pc 的请求。

这是一个冗长的例子,有更清洁的解决方案,但这更清楚。

在示例中,arduino 等待来自 pc 的“a”或“b”。选中复选框时,PC 发送一个“a”,未选中复选框时发送一​​个“b”。该示例假定 arduino 上的数字引脚 4。

Arduino代码

#define DIGI_PIN_SOMETHING 4
unit8_t commandIn;
void setup()
{
    //create a serial connection at 57500 baud
    Serial.begin(57600);
}

void loop()
{
    //if we have some incomming serial data then..
    if (Serial.available() > 0)
    {
        //read 1 byte from the data sent by the pc
        commandIn = serial.read();
        //test if the pc sent an 'a' or 'b'
        switch (commandIn)
        {
            case 'a':
            {
                //we got an 'a' from the pc so turn on the digital pin
                digitalWrite(DIGI_PIN_SOMETHING,HIGH);
                break;
            }
            case 'b':
            {
                //we got an 'b' from the pc so turn off the digital pin
                digitalWrite(DIGI_PIN_SOMETHING,LOW);
                break;
            }
        }
    }
}

视窗 C#

此代码将驻留在您的表单 .cs 文件中。该示例假定您已将 OnOpenForm、OnCloseForm 和 OnClick 事件的表单事件附加到复选框。从每个事件中,您可以调用下面的相应方法....

using System;
using System.IO.Ports;

class fooForm and normal stuff
{
    SerialPort port;

    private myFormClose()
    {
        if (port != null)
        port.close();
    }

    private myFormOpen()
    {
        port = new SerialPort("COM4", 57600);
        try
        {
            //un-comment this line to cause the arduino to re-boot when the serial connects
            //port.DtrEnabled = true;

            port.Open();
        } 
        catch (Exception ex)
        {
            //alert the user that we could not connect to the serial port
        }
    }

    private void myCheckboxClicked()
    {
        if (myCheckbox.checked)
        {
            port.Write("a");
        } 
        else
        {  
            port.Write("b");    
        }
    }
}

提示:

如果您想从 arduino 读取消息,请在表单中添加一个计时器,间隔为50100毫秒。

如果OnTick是 Timer,您应该使用以下代码检查数据:

//this test is used to see if the arduino has sent any data
if ( port.BytesToRead > 0 )

//On the arduino you can send data like this 
Serial.println("Hellow World") 

//Then in C# you can use 
String myVar = port.ReadLine();

readLine()will的结果是myVar包含Hello World.

于 2012-08-27T22:00:31.280 回答
8

我相信你知道 Arduino 有一些你可以在 C# 中使用的示例

这是他们的 C# 页面

于 2012-05-02T20:17:15.780 回答
5

由于您使用的是 Visual Studio,因此您可能会对这个用于 Arduino 开发的酷炫 Visual Studio 插件感兴趣。http://www.visualmicro.com

于 2012-05-21T17:47:23.133 回答
0

PC 和 Arduino 之间通信的基本方式是在 PC 上创建 2 个按钮并打开/关闭 Arduino 上的灯。采用portwrite();

这是最简单的演示: https ://www.instructables.com/id/C-Serial-Communication-With-Arduino/ 这绝对是你想要的!

C#代码:

using System;
using System.Windows.Forms;
using System.IO.Ports;
namespace ledcontrol
{
    public partial class Form1 : Form
    {
        SerialPort port;
        public Form1()
        {
            InitializeComponent();
            this.FormClosed += new FormClosedEventHandler(Form1_FormClosed);
            if (port==null)
            {
                port = new SerialPort("COM7", 9600);//Set your board COM
                port.Open();
            }
        }
        void Form1_FormClosed(object sender,FormClosedEventArgs e)
        {
            if(port !=null &&port.IsOpen)
            {
                port.Close();
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            PortWrite("1");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            PortWrite("0");
        }
        private void PortWrite(string message)
        {
            port.Write(message);
        }
    }
}

Arduino草图:

const int LedPin = 13;  
int ledState = 0;  

void setup()  
{   
  pinMode(LedPin, OUTPUT);  

  Serial.begin(9600);    
}  

void loop()  
{   
    char receiveVal;     

    if(Serial.available() > 0)  
    {          
        receiveVal = Serial.read();  

       if(receiveVal == '1')      
          ledState = 1;     
       else  
          ledState = 0;       
    }     

    digitalWrite(LedPin, ledState);   

    delay(50);      
}
于 2018-02-05T06:55:22.107 回答