使用 Serial.Port 从 C# 到 Arduino

From C# To Arduino using Serial.Port

大家好,我的项目需要你们的帮助。我在 C# 程序中有 2 个文本框(类型字符串),我需要使用 Serial.Port 将这些数字发送到 Arduino。到目前为止,我必须将其中一个值发送给 arduino,但如果我输入“1200”,arduino 会读取并显示:1,2,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# 中

  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/serialport:

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;
      }
    }