Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从arduino向c#接收和发送数据,反之亦然_C#_Arduino_Serial Communication - Fatal编程技术网

从arduino向c#接收和发送数据,反之亦然

从arduino向c#接收和发送数据,反之亦然,c#,arduino,serial-communication,C#,Arduino,Serial Communication,首先,我昨天早上开始使用c#,所以我为可能出现的愚蠢问题道歉 到目前为止,我编写了以下代码。我能够将数据从c#发送到arduino,这似乎工作正常。现在我想通过serial.print同时从arduino接收数据,并将其显示在一个框(ListBox?)中。如何将此添加到代码中 我将非常感谢您的任何意见、建议和想法 namespace WindowsFormsApplication1 { public partial class Form1 : Form { pu

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

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

我也像您一样,但是我用了一个电位计,输出逻辑发送给C,C,读取它,但是我用协议来读取arduino,你在arduino中的代码取决于你想要读取和发送什么,好的,呵呵,希望这对你有帮助:D

你必须在C#中使用这个:


}

如果您正在寻找一种轻量级解决方案,您可以看看Sharer:

#包括
//一个简单的函数,它将一个整数和一个字节相加并返回一个整数
整数和(整数a,字节b){
返回a+b;
}
//返回^2的简单函数
浮动正方形(浮动a){
返回a*a;
}
//初始化Sharer并声明要共享的函数
无效设置(){
sharr.init(115200);//具有115200波特的init串行通信
//向Sharer公开此函数:int Sum(int a,字节b)
共享函数(int,Sum,int,a,byte,b);
//将此函数公开给Sharer:float Square(float a)
Sharer_ShareFunction(浮点、平方、浮点、a);
}
//在主循环中运行共享引擎
void循环(){
share.run();
}
在您的C#应用程序中:

//连接到Arduino板
var连接=新的共享连接(“COM3”,115200);
connection.Connect();
//扫描所有共享的功能
connection.RefreshFunctions();
//远程调用Arduino上的函数并等待结果
var结果=连接调用(“总和”,10,12);
//显示结果
Console.WriteLine(“状态:+result.Status”);
Console.WriteLine(“类型:“+result.Type”);
Console.WriteLine(“值:+result.Value”);
//状态:OK
//类型:int
//价值:22

您所说的“同时”是什么意思?您想接收每次按钮点击的响应,还是想不考虑活动而持续接收和显示数据?是的,不考虑我向Arduino发送数据而持续接收和显示数据您想使用单独的线程来处理从Arduino接收数据。在应用程序UI线程继续运行时,有许多使用线程来处理工作的示例。
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";
        }
    }
}