Я могу отправить данные в Arduino, но я не могу получить данные от него - PullRequest
0 голосов
/ 13 января 2019

Я сделал приложение для формы Windows, в этой форме я хочу читать и записывать последовательные данные в мой Pro Micro.
Отправка данных в микроконтроллер работает должным образом, но я не могу прочитать их.
Более того, микроконтроллер не отправляет данные.

Прямо сейчас я удалил весь ненужный код, и микроконтроллер должен просто повторить то, что я отправил.
Когда я использую это в последовательном мониторе Arduino, все это работает, я записываю данные, и он возвращает их.
Но при попытке сделать это в форме окна это не так.
Затем я решил измерить вывод tx микроконтроллера, и он вообще не отправлял никаких данных, хотя полученные данные были правильными.
Была разница в длине импульса, но я думаю, что этого недостаточно, чтобы форма имела длительность 0,1039 мс (частота 9,624 Гц), а монитор Arduino имел длительность 0,1041 мс (частота 9,606). Гц).

Вот мой код:

Form1:

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

Arduino:

void setup() {
    Serial.begin(9600);
}

void loop() {
    while(Serial.available() == 0);
    while(Serial.available() > 0) Serial.write(Serial.read());
}

1 Ответ

0 голосов
/ 13 января 2019

Извините, я обнаружил проблему при работе с 3-ей версией, вам нужно добавить serial.DtrEnable = true; для того, чтобы это слово.

...