从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#到Arduino使用Serial.Port

通过串行端口读取数据并使用字符串分隔它们。

在 C# 中

  1. 将唯一字符添加到第一个框数据的开头。
  2. 将唯一字符添加到第二个框数据的开头。
  3. 在第二个框数据的末尾添加一个唯一字符。
  4. 附加两个字符串并作为单个字符串发送。

我有一个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;
      }
    }