-->

接收和Arduino的数据发送到C#,反之亦然(Receive and send data from

2019-10-21 00:38发布

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

到目前为止,我写了下面的代码。 我能够从C#的数据发送到Arduino的,这似乎是工作的罚款。 现在我想从Arduino的接收数据,通过serial.print,在同一时间,并在框中显示它(列表框?)。 怎么能添加此的代码?

我将感谢任何输入,提示和建议。

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");
            }
        }

Answer 1:

随着SolidSoils4Arduino可以同时读写串口消息。 所述Solid.Arduino.IStringProtocol支持串消息的异步阅读和Solid.Arduino.ArduinoSession具有StringReceived当已经接收到触发消息事件。



Answer 2:

我也同样喜欢你,但我用一个电位器的出anologic发送到C#和C#读它,但我用读Arduino的,你在Arduino的代码协议它dependsabout你想阅读并送什么好呵呵我希望这会帮助你: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";
        }
    }
}

}



Answer 3:

如果你正在寻找一个轻量级的解决方案,你可以共享者一起来看看: 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


文章来源: Receive and send data from arduino to c# and vice versa