簡體   English   中英

從arduino接收數據並將數據發送到C#,反之亦然

[英]Receive and send data from arduino to c# and vice versa

首先,我昨天早晨開始使用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");
            }
        }

使用SolidSoils4Arduino,您可以同時讀取和寫入串行消息。 Solid.Arduino.IStringProtocol支持異步讀取字符串消息,而Solid.Arduino.ArduinoSession具有StringReceived事件,該事件在收到消息時觸發。

我做過像您一樣的事情,但是我使用了電位計,將信號發送到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";
        }
    }
}

}

如果您正在尋找輕量級的解決方案,則可以查看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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM