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