Nano Hash - криптовалюты, майнинг, программирование

Получение данных от arduino через последовательный порт в приложении C#

Мне нужно сделать приложение, которое отправляет и получает данные от arduino leonardo. Я попробовал несколько примеров последовательного соединения между C# и Arduino, и во всех случаях у меня была одна и та же проблема: arduino получает данные, отправленные приложением, но приложение не получает данные, отправленные Arduino. Я проверил с эмулятором COM, и он отлично работал, но с arduino не работает.

Вот используемые коды.

Приложение С#:

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

Ардуино:

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
  }
}
16.12.2018

  • serialPort1_DataReceived() вам необходимо либо зарегистрировать событие в свойствах порта, либо в коде использовать += 16.12.2018
  • Это уже было установлено на панели событий на экране дизайна. 16.12.2018
  • почему задержка в Arduino? 16.12.2018
  • Только тест, без задержки тоже не работает 16.12.2018

Ответы:


1

Мне нравится использовать Thread и цикл для чтения последовательных данных. В вашем случае вы должны зарегистрировать свое событие, например:

serialPort1.DataReceived +=serialPort1_DataReceived;

и открыть его

serialPort1.Open();

В результате событие будет срабатывать всякий раз, когда будут получены данные.

16.12.2018
  • Это уже было установлено на панели событий на экране дизайна. Я пытался использовать потоки, но это тоже не сработало. 16.12.2018
  • @Dan Pimentel, поэтому не должно быть никаких проблем с программным обеспечением. Другим предположением может быть разница между скоростью передачи данных или разницей между уровнем напряжения, чтобы убедиться, что заземление на стороне ПК подключено к заземлению Леонардо. 16.12.2018
  • На другом sidr вы можете сначала проверить свой код leonardo side с помощью терминала последовательного порта Ardiono IDE. Убедившись в leonardo, поработайте над c# sidr 16.12.2018
  • Я тестировал и arduino, и c# в putty и другом эмуляторе COM-порта, и оба работали. 17.12.2018
  • @DanPimentel, если вы уверены в стороне Arduino, четности, Stopbit, RTS и других свойствах последовательного порта, используйте это приложение C# с открытым исходным кодом, чтобы найти проблему. Насколько я вижу, в вашем коде С# нет никаких проблем. 17.12.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..