I need to make an application that sends and receives data from an arduino leonardo. I tried some examples of serial connection between C # and Arduino and in all instances I had the same problem, Arduino receives data sent by the application but the application does not receive the data sent by Arduino.
Follow the codes used.
Application code 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();
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 code:
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
}
}