在C#应用程序中通过串行从arduino接收数据

时间:2018-12-16 13:12:24

标签: c# arduino serial-port

我需要制作一个从arduino leonardo发送和接收数据的应用程序。我尝试了一些C#与Arduino之间的串行连接示例,在所有情况下,我都遇到相同的问题,arduino接收到应用程序发送的数据,但应用程序未接收到Arduino发送的数据。我使用COM模拟器进行了测试,它可以完美运行,但是使用arduino却无法正常工作。

这里是使用的代码。

应用程序C#:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp2 {
public partial class Form1 : Form {

    string RxString;
    public Form1() {
        InitializeComponent();
        serialPort1.DataReceived += serialPort1_DataReceived;
        timerCOM.Enabled = true;
    }

    private void atualizaListaCOMs() {
        int i;
        bool quantDiferente; //flag para sinalizar que a quantidade de portas mudou

        i = 0;
        quantDiferente = false;

        //se a quantidade de portas mudou
        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;
        }

        //Se não foi detectado diferença
        if (quantDiferente == false) {
            return;                     //retorna
        }

        //limpa comboBox
        comboBox1.Items.Clear();

        //adiciona todas as COM diponíveis na lista
        foreach (string s in SerialPort.GetPortNames()) {
            comboBox1.Items.Add(s);
        }
        //seleciona a primeira posição da lista
        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)  // se porta aberta
            serialPort1.Close();         //fecha a porta
    }

    private void btEnviar_Click(object sender, EventArgs e) {
        if (serialPort1.IsOpen == true)          //porta está aberta
            serialPort1.Write(textBoxEnviar.Text);  //envia o texto presente no textbox Enviar
    }

    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e) {
        RxString = serialPort1.ReadExisting();              //le o dado disponível na serial
        this.Invoke(new EventHandler(trataDadoRecebido));   //chama outra thread para escrever o dado no text box
    }

    private void trataDadoRecebido(object sender, EventArgs e) {
        textBoxReceber.AppendText(RxString);
    }
    }
}

Arduino:

void setup()
{
  Serial.begin(9600);  //inicia comunicação serial com 9600
}

void loop()
{
  if(Serial.available())        //se algum dado disponível
  {
    char c = Serial.read();   //le o byte disponivel
    delay(500);
    Serial.write(c);           //retorna o que foi lido
  }
}

1 个答案:

答案 0 :(得分:0)

我喜欢使用Thread和循环读取串行数据。 在您的情况下,您必须注册活动,例如:

Sub CopyData2()
    Dim copyRng As Range, cl As Range

    Set copyRng = Worksheets("Backend").Range("AB2:AB" & Worksheets("Backend").Cells(Rows.Count, "AB").End(xlUp).Row)

    With Worksheets("Availability")
        For Each cl In copyRng
            If cl = "A" Then
                pasteRow = .Cells(.Rows.Count, "A").End(xlUp).Row + 1
                Worksheets("Backend").Range("V" & cl.Row & ":X" & cl.Row).Copy Destination:=.Range("A" & pasteRow & ":C" & pasteRow)
            End If
        Next cl
    End With
End Sub

然后打开

serialPort1.DataReceived +=serialPort1_DataReceived;

因此,只要收到数据,便会触发evet。