从C#到Arduino使用Serial.Port
本文关键字:Serial Port 使用 Arduino | 更新日期: 2023-09-27 17:55:42
大家好,我需要你们帮助我的项目。我在 C# 程序中有一个 2 个文本框(类型字符串),我需要使用 Serial.Port 将此数字发送到 Arduino。到目前为止,我必须将其中一个值发送到 arduino,但如果我输入"1200",arduino 读取并显示:1,2,0,0,0 我需要"1200",它的效果不佳。如何将 2 个值从 C# 发送到 Arduino?arduino 将如何读取这些值(x 和 y)?
C#
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports; // necessário para ter acesso as portas
namespace interfaceArduinoVS2013
{
public partial class Form1 : Form
{
string RxString;
public Form1()
{
InitializeComponent();
timerCOM.Enabled = true;
}
private void atualizaListaCOMs()
{
int i;
bool quantDiferente; //If there are more ports
i = 0;
quantDiferente = false;
//if there are new ports
if (comboBox1.Items.Count == SerialPort.GetPortNames().Length)
{
foreach (string s in SerialPort.GetPortNames())
{
if (comboBox1.Items[i++].Equals(s) == false)
{
quantDiferente = true;
}
}
}
else
{
quantDiferente = true;
}
//it was't detected difference
if (quantDiferente == false)
{
return;
}
//clean comboBox
comboBox1.Items.Clear();
//add all the COMs in the list
foreach (string s in SerialPort.GetPortNames())
{
comboBox1.Items.Add(s);
}
//select the first position
comboBox1.SelectedIndex = 0;
}
private void timerCOM_Tick(object sender, EventArgs e)
{
atualizaListaCOMs();
}
private void btConectar_Click(object sender, EventArgs e)
{
if (serialPort1.IsOpen == false)
{
try
{
serialPort1.PortName = comboBox1.Items[comboBox1.SelectedIndex].ToString();
serialPort1.Open();
}
catch
{
return;
}
if (serialPort1.IsOpen)
{
btConectar.Text = "Desconectar";
comboBox1.Enabled = false;
}
}
else
{
try
{
serialPort1.Close();
comboBox1.Enabled = true;
btConectar.Text = "Conectar";
}
catch
{
return;
}
}
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if(serialPort1.IsOpen == true) // if the port is open
serialPort1.Close(); //close
}
private void btEnviar_Click(object sender, EventArgs e)
{
if(serialPort1.IsOpen == true) //porta está aberta
serialPort1.Write(textBoxX.Text); //send the text from textboxX
serialPort1.Write(textBoxY.Text);
}
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
RxString = serialPort1.ReadExisting(); //read data from serial
this.Invoke(new EventHandler(trataDadoRecebido));
}
private void trataDadoRecebido(object sender, EventArgs e)
{
textBoxReceber.AppendText(RxString);
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
}
Arduino 脚本
void setup()
{
Serial.begin(9600);
}
void loop()
{
if(Serial.available())
{
char c = Serial.read();
Serial.println(c);
}
}
通过串行端口读取数据并使用字符串分隔它们。
在 C# 中
- 将唯一字符添加到第一个框数据的开头。
- 将唯一字符添加到第二个框数据的开头。
- 在第二个框数据的末尾添加一个唯一字符。
- 附加两个字符串并作为单个字符串发送。
我有一个VB示例:
Dim WithEvents ADRport As SerialPort = New System.IO.Ports.SerialPort("COM1", 9600, Parity.None, 8, StopBits.One)
msg = "$" & box1.Text & "#" & box2.Text & "*" & vbCrLf
ADRport.Write(msg)
在Arduino中:
//--- Wait for the message starting -----
while(Serial.read()!='$');
while (!flag)
{
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
mstr += inChar;
//Serial.write(inChar);
// if the incoming character is a end of line, set a flag
if (inChar == '*')
{
flag = true;
}
}
使用分隔字符串
int 1start = int(mstr.indexOf('$'));
int 2start = int(mstr.indexOf('#',numstart+1));
int 2end = int(mstr.indexOf('*'));
text1 = mstr.substring(1start+1,2start);
text2 = mstr.substring(2start+1,2end);
text1.trim();
text1.trim();
然后在液晶屏/串行端口上显示它:
lcd.setCursor(0,0);
lcd.print(msg);
请注意,"$"不会被添加到字符串中。
这就是我所做的,它奏效了:
C#
serialPort1.WriteLine(eixver.Text.ToString()+";"+ eixHor.Text.ToString());
Arduino:
int val;
int h, v;
String cont;
void setup() {
Serial.begin(9600);
}
void loop() {
while(Serial.available())
{
char caracter = Serial.read();
cont.concat(caracter);
delay(5);
}
if(cont!="")
{
// Serial.println(cont);
v=cont.substring(0, cont.indexOf(';')).toInt();
h=cont.substring(cont.indexOf(';')+1, cont.length()).toInt();
Serial.print("v=");
Serial.print(v);
Serial.print(" - h=");
Serial.print(h);
cont="";
}
}
我认为
这对你有好处。C# 部分:
Connect();
if (serialPort1.IsOpen)
{
double MyInt = ToDouble(lblMixerCase.Text);
byte[] b = GetBytes(MyInt);
serialPort1.Write(b, 0, 1);
double MyInt2 = ToDouble(txtRPM.Text);
byte[] z = GetBytes(MyInt2);
serialPort1.Write(z, 0, 1);
if (MyInt2>1600)
{
MessageBox.Show("Please enter RPM value between 0 and 1600");
}
double MyInt3 = ToDouble(lblCaseRpmSecond.Text);
byte[] p = GetBytes(MyInt3);
serialPort1.Write(p, 0, 1);
double MyInt4 = ToDouble(lblRpmCaseThree.Text);
byte[] s = GetBytes(MyInt3);
serialPort1.Write(s, 0, 1);
serialPort1.Close();
Arduino部分:
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (Serial.available() > 0) {
// read the incoming byte:
n = Serial.read();
if (i < 3)
{
number[i] = n;
switch (number[0])
{
case 1:
if (i == 2)
{
switch(number[1])
{
case 1:
openClose();
break;
case 2:
openCloseTwice();
break;
case 3:
openCloseThree();
break;
default:
openCloseIwanted(number[1], number[2]);
break;
}
}
break;
case 2:
if (i == 2)
{
switch(number[1])
{
case 1:
openClose();
break;
case 2:
openCloseTwice();
break;
case 3:
openCloseThree();
break;
default:
openCloseIwanted(number[1], number[2]);
break;
}
}
break;
case 3:
if (i == 2)
{
openCloseIwanted(number[1], number[2]);
}
break;
default:
if (i == 2)
{
openCloseIwanted(number[1], number[2]);
}
break;
}
i++;
if (i == 3)
{
asm volatile (" jmp 0"); //For reset Arduino
}
}
else
{
i = 0;
}
}