我需要制作一个从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
}
}
答案 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。