[英]How to send serial data from Arduino to Visual Studio C# with zedgraph and vice versa simultaniously
[英]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.