简体   繁体   English

Arduino的C#串行端口通信

[英]C# serialport communication for Arduino

I made a little application for my Arduino in C#. 我用C#为Arduino开发了一个小应用程序。 Everything works fine, but the problem is in my application. 一切正常,但问题出在我的应用程序中。 The user can chose his/hers COM port in a numericUpDown. 用户可以在numericUpDown中选择他/她的COM端口。

It works, but if the user chose the wrong port and tries to connect, it crashes, so I was thinking I need an IF statmant that gives a message. 它可以工作,但是如果用户选择了错误的端口并尝试连接,则会崩溃,因此我以为我需要提供消息的IF statmant。 For example, the wrong port, etc., but I don't know how to make it. 例如,错误的端口等,但是我不知道该怎么做。 How can I do it? 我该怎么做?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;

namespace IO_Arduino_experiment_project
{
    public partial class Form1 : Form
    {
        public static System.IO.Ports.SerialPort serialPort1;
        private delegate void LineReceivedEvent(string line);
        public Form1()
        {
            InitializeComponent();
            button5.Enabled = false;
            button2.Enabled = false;
            button3.Enabled = false;
        }

        private void button1_Click(object sender, EventArgs e) // Connect Button
        {
            System.ComponentModel.IContainer components = new System.ComponentModel.Container();
            serialPort1 = new System.IO.Ports.SerialPort(components); // Creating the new object.
            serialPort1.PortName = "COM" + numericUpDown1.Value.ToString(); // Setting what port number.
            serialPort1.BaudRate = 9600;
            serialPort1.DtrEnable = true;
            serialPort1.Open(); // Open the port for use.
            button1.Text = "Connected.";
            button1.Enabled = false;
            numericUpDown1.Enabled = false;
            button5.Enabled = true;
            button2.Enabled = true;
            button3.Enabled = true;
        }

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {

        }

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

        private void button2_Click(object sender, EventArgs e)
        {
            serialPort1.Write("1");
            textBox1.Text = "LED is on!";
            button2.Enabled = false;
            button3.Enabled = true;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            serialPort1.Write("0");
            textBox1.Text = "LED is off!";
            button2.Enabled = true;
            button3.Enabled = false;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            serialPort1.Close();
            button1.Enabled = true;
            numericUpDown1.Enabled = true;
        }
    }
}

You should really replace the numeric up/down with a ComboBox or some other list control/menu that populates when the form opens or when a refresh button is clicked (or by other automatic means such as a timer). 您应该真正用ComboBox或在列表打开时或单击刷新按钮时(或通过其他自动方式,例如计时器)填充的其他列表控件/菜单替换上/下数字。

The ComboBox or List can be filled using the GetPortNames method:- 可以使用GetPortNames方法填充ComboBoxList

String[] pNames;
pNames = System.IO.Ports.SerialPort.GetPortNames();

If you want to do what you have described then you can lookup the port to see if it exists prior to attempted use using similar code:- 如果您要执行所描述的操作,则可以使用类似的代码查找端口,以在尝试使用之前查看该端口是否存在:

if (System.IO.Ports.SerialPort.GetPortNames().indexOf("COM" +  thePortNum.ToString())>-1)

Note that GetPortNames() returns a list like this:- 请注意, GetPortNames()返回如下列表:

 COM1
 COM10
 COM12

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM