接收数据并将数据从arduino发送到c#,反之亦然

时间:2014-09-24 01:51:28

标签: c# arduino serial-communication

首先我昨天早上开始使用c#所以我为潜在的麻木问题道歉。

到目前为止,我编写了以下代码。我能够将数据从c#发送到arduino,这似乎工作正常。现在我想通过serial.print同时从arduino接收数据并将其显示在一个框中(ListBox?)。如何将其添加到代码中?

我会感谢任何意见,提示和想法。

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
            stop.Enabled = false;
            left.Enabled = false;
            right.Enabled = false;
            up.Enabled = false;
            down.Enabled = false;
            string[] ports = SerialPort.GetPortNames();
            comboBox1.Items.AddRange(ports);

        }
        private void Form1_Load(object sender, EventArgs e)
        {


        }
        private void start_Click(object sender, EventArgs e)
        {


            if (comboBox1.SelectedIndex > -1)
            {
                string port = (string)comboBox1.SelectedItem;
                serialPort2.PortName = port; // "port";
                serialPort2.BaudRate = 9600;
                serialPort2.Open();
                if (serialPort2.IsOpen)
                {
                    start.Enabled = false;
                    stop.Enabled = true;
                    left.Enabled = true;
                    right.Enabled = true;
                    up.Enabled = true;
                    down.Enabled = true;
                }
            }
                else
                {
                    MessageBox.Show("Please connect the Arduino and select a Port");
                }

        }
        private void stop_Click(object sender, EventArgs e)
        {
            if (serialPort2.IsOpen)
            {
                serialPort2.Close();
                start.Enabled = true;
                stop.Enabled = false;
                left.Enabled = false;
                right.Enabled = false;
                up.Enabled = false;
                down.Enabled = false;
            }
        }
        private void up_Click(object sender, EventArgs e)
        {

            if (serialPort2.IsOpen)
            {
                serialPort2.WriteLine("1");
            }

        }

        private void left_Click(object sender, EventArgs e)
        {

            if (serialPort2.IsOpen)
            {
                serialPort2.WriteLine("4");
            }

        }

        private void right_Click(object sender, EventArgs e)
        {
            if (serialPort2.IsOpen)
            {
                serialPort2.WriteLine("2");
            }
        }

        private void down_Click(object sender, EventArgs e)
        {
            if (serialPort2.IsOpen)
            {
                serialPort2.WriteLine("3");
            }
        }

3 个答案:

答案 0 :(得分:1)

使用SolidSoils4Arduino,您可以同时读取和写入串行消息。 Solid.Arduino.IStringProtocol支持异步读取字符串消息,Solid.Arduino.ArduinoSession有一个StringReceived事件,在收到消息时会触发。

答案 1 :(得分:0)

我做了同样的事情,但是我使用电位器将out anical发送到C#和C#读取它但是我使用了读取arduino的协议,你的代码在arduino它取决于你想要读什么并发送好呵呵我希望这有助于你:D

你必须在C#中使用它:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;
using System.Data;

namespace ArduinoValor
 {
internal class Class1
{
    public string port = "";
    static SerialPort currentPort;
    public Boolean connect(int baud, string recognizeText, byte paramone, byte paramtwo, byte paramthree)
    {
        try
        {
            byte[] buffer = new byte[3];
            buffer[0] = Convert.ToByte(paramone);
            buffer[1] = Convert.ToByte(paramtwo);//para los detalles 
            buffer[2] = Convert.ToByte(paramthree); //

            int intReturnASCII = 0;
            char charReturnValue = (Char)intReturnASCII;
            string[] ports = SerialPort.GetPortNames();
            foreach (string newport in ports)
            {
                currentPort = new SerialPort(newport, baud); 
                currentPort.Open();// Abre el serial 
                currentPort.Write(buffer, 0,3); 
                Thread.Sleep(1000); 
                int count = currentPort.BytesToRead; //lee los bytes
                string returnMessage = "";
                while (count > 0)
                {
                    intReturnASCII = currentPort.ReadByte();
                    returnMessage = returnMessage + Convert.ToChar(intReturnASCII);
                    count--;
                }
                currentPort.Close();
                port = newport;
                if (returnMessage.Contains(recognizeText))
                {
                    return true;
                }
            }
            return false;
        }
        catch (Exception e)
        {
            return false;
        }
    }
    public string message(byte paramone, byte paramtwo, byte paramthree)
    {
        try
        {
            byte[] buffer = new byte[3];
            buffer[0] = Convert.ToByte(paramone);
            buffer[1] = Convert.ToByte(paramtwo);
            buffer[2] = Convert.ToByte(paramthree);

            currentPort.Open();
            currentPort.Write(buffer, 0, 3);
            int intReturnASCII = 0;
            char charReturnValue = (char)intReturnASCII;
            Thread.Sleep(1000); 
            int count = currentPort.BytesToRead;
            string returnMessage = "";
            while (count > 0)
            {
                intReturnASCII = currentPort.ReadByte();
                returnMessage = returnMessage + Convert.ToChar(intReturnASCII);
                count--;
            }
            currentPort.Close();
            return returnMessage;
        }
        catch (Exception e)
        {
            return "Error";
        }
    }
}

}

答案 2 :(得分:0)

如果您正在寻找轻量级的解决方案,则可以查看Sharer:https://github.com/Rufus31415/Sharer

#include <Sharer.h>

// A simple function that sums an integer and a byte and return an integer
int Sum(int a, byte b) {
    return a + b;
}

// A simple function that return a^2
float Square(float a) {
    return a * a;
}

// Init Sharer and declare your function to share
void setup() {
    Sharer.init(115200); // Init Serial communication with 115200 bauds

    // Expose this function to Sharer : int Sum(int a, byte b) 
    Sharer_ShareFunction(int, Sum, int, a, byte, b);

    // Expose this function to Sharer : float Square(float a)
    Sharer_ShareFunction(float, Square, float, a);
}

// Run Sharer engine in the main Loop
void loop() {
    Sharer.run();
}

在您的C#应用​​程序中:

// Connect to Arduino board
var connection = new SharerConnection("COM3", 115200);
connection.Connect();

// Scan all functions shared
connection.RefreshFunctions();

// remote call function on Arduino and wait for the result
var result = connection.Call("Sum", 10, 12);

// Display the result
Console.WriteLine("Status : " + result.Status);
Console.WriteLine("Type : " + result.Type);
Console.WriteLine("Value : " + result.Value);

// Status : OK
// Type : int
// Value : 22