首先我昨天早上开始使用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");
}
}
答案 0 :(得分:1)
使用SolidSoils4Arduino,您可以同时读取和写入串行消息。 Solid.Arduino.IStringProtocol
支持异步读取字符串消息,Solid.Arduino.ArduinoSession
有一个StringReceived
事件,在收到消息时会触发。
答案 1 :(得分:0)
我做了同样的事情,但是我使用电位器将out anical发送到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";
}
}
}
}
答案 2 :(得分:0)
如果您正在寻找轻量级的解决方案,则可以查看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