[英]Receive and send data from arduino to c# and vice versa
first of all I started using c# yesterday morning so I apologize for potential numb questions. 首先,我昨天早晨开始使用c#,因此对可能出现的麻木问题表示歉意。
So far I wrote the following code. 到目前为止,我编写了以下代码。 I'm able to send data from c# to arduino which seems to be working fine.
我能够将数据从C#发送到arduino,这似乎工作正常。 Now i would like to receive data from arduino, through serial.print, at the same time and display it in a box (ListBox?).
现在,我想同时通过serial.print从arduino接收数据,并将其显示在一个框中(ListBox?)。 How could add this to the code?
如何将其添加到代码中?
I would be thankful for any input, tips and ideas. 我将不胜感激任何输入,提示和想法。
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");
}
}
With SolidSoils4Arduino you can simultaneously read and write serial messages. 使用SolidSoils4Arduino,您可以同时读取和写入串行消息。 The
Solid.Arduino.IStringProtocol
supports asynchronous reading of string messages and the Solid.Arduino.ArduinoSession
has a StringReceived
event that fires when a message has been received. Solid.Arduino.IStringProtocol
支持异步读取字符串消息,而Solid.Arduino.ArduinoSession
具有StringReceived
事件,该事件在收到消息时触发。
i did the same like you , but i used a potentiometer the out anologic send to C# and C# read it but i used the protocols for read arduino, your code in arduino It dependsabout what you want read and send ok hehe i hope this help you :D 我做过像您一样的事情,但是我使用了电位计,将信号发送到C#并用C#读取,但是我使用了协议来读取arduino,您在arduino中的代码这取决于您要读取和发送的内容,好吧,希望对您有所帮助:d
you have to use this in C# : 您必须在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";
}
}
}
} }
If you are looking for a lightweight solution, you can have a look on Sharer : https://github.com/Rufus31415/Sharer 如果您正在寻找轻量级的解决方案,则可以查看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();
}
In your C# application : 在您的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.