c# - 我可以向 Arduino 发送数据,但无法从它接收数据
问题描述
我制作了一个 Windows 窗体应用程序,我想以这种形式读取串行数据并将其写入我的 Pro Micro。
将数据发送到 µC 可以正常工作,但我无法从中读取。
更重要的是,µC 不发送数据。
现在我删除了所有不必要的代码,µC 应该只是回应我发送的内容。
当我在 Arduino 串行监视器中使用它时,它一切正常,我写入数据并返回它。
但是当在 windows 窗体中尝试这个时,它不会。
然后我决定测量 µC 的 tx 引脚,它根本没有发送任何数据,尽管接收到的数据是正确的。
脉冲长度存在差异,但我认为这不足以导致这种情况,表格的持续时间为 0.1039 毫秒(频率为 9.624 赫兹),而 Arduino 监视器的持续时间为 0.1041 毫秒(频率为 9.606赫兹)。
这是我的代码:
表格1:
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 UART
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.TopMost = true; // Window always on top
this.AutoSize = true; // The size of the window will always be as small as possible while still showing all content
serial.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_DataReceived);
lblInvalidPort.Hide();
tbWriteInput.Enabled = false;
btnSend.Enabled = false;
// Show all ports in the ports combobox and sellect the curently used option
combPort.Items.Clear();
combPort.Items.AddRange(SerialPort.GetPortNames());
combPort.SelectedItem = serial.PortName;
}
private void serial_ErrorReceived(object sender, SerialErrorReceivedEventArgs e)
{
rtbRead.Text = e.ToString() + "\n" + rtbRead.Text;
MessageBox.Show(e.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
private void combPort_Click(object sender, EventArgs e)
{
// Show all ports in the ports combobox and sellect the curently used option
combPort.Items.Clear();
combPort.Items.AddRange(SerialPort.GetPortNames());
}
private void btnConnect_Click(object sender, EventArgs e)
{
if (btnConnect.Text.ToLower().Equals("connect"))
{
try
{
serial.PortName = combPort.Text;
serial.BaudRate = 9600;
serial.Open();
lblInvalidPort.Hide();
tbWriteInput.Enabled = true;
btnSend.Enabled = true;
btnConnect.Text = "Disconnect";
}
catch (Exception err)
{
lblInvalidPort.Show();
MessageBox.Show(err.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
tbWriteInput.Enabled = false;
btnSend.Enabled = false;
}
}
else if (btnConnect.Text.ToLower().Equals("disconnect"))
{
serial.Close();
tbWriteInput.Enabled = false;
btnSend.Enabled = false;
btnConnect.Text = "Connect";
}
}
private void serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
MessageBox.Show("Got some data", "Serial", MessageBoxButtons.OK, MessageBoxIcon.Warning);
rtbRead.Text = serial.ReadExisting() + "\n" + rtbRead.Text;
}
private static void mySerialPort_DataReceived(
object sender,
SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
MessageBox.Show("Got some data", "Serial", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
private void tbWriteInput_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Tab)
{
rtbWrite.Text = tbWriteInput.Text + "\n" + rtbWrite.Text;
serial.Write(tbWriteInput.Text);
}
}
private void btnSend_Click(object sender, EventArgs e)
{
rtbWrite.Text = tbWriteInput.Text + "\n" + rtbWrite.Text;
serial.Write(tbWriteInput.Text);
}
}
}
阿杜诺:
void setup() {
Serial.begin(9600);
}
void loop() {
while(Serial.available() == 0);
while(Serial.available() > 0) Serial.write(Serial.read());
}
解决方案
抱歉,我在处理第三个版本时发现了问题,您需要添加serial.DtrEnable = true;
才能将其添加到单词中。
推荐阅读
- ruby - 在 ruby 中确保只有某些方法可用
- javascript - 按照模式自动在文本中创建链接
- sparql - Ontodia 库 - RangeError:超出最大调用堆栈大小
- matlab - 是否有可能出现一段时间错误或没有错误Matlab
- ruby-on-rails-4 - 数据未保存在嵌套表单中
- google-sheets - 如何从谷歌表格数据透视表中的另一个计算字段中引用计算字段?
- java - 控制异常输出格式
- dart - Flutter:将来自 http 调用的 Future 响应捕获为普通列表
- android - 如何允许BottomSheetDialog的外部触摸?
- node.js - 原始操作未执行