Wie kontinuierlich gelesen, die serielle Daten vom Arduino in C#, während die Schleife zum aktualisieren der Seriennummer.readExisting() Daten

Ich bin mit meinem Arduino UNO board zu Lesen und der plot Punkte auf einem radar-display. Ich bin empfangen von seriellen Daten auf meinem PC, der wie folgt aussieht:

44.16 ; 48
44.47 ; 49
44.57 ; 50
44.88 ; 51
158.01 ; 52
44.88 ; 53

Die erste Zahl ist die Entfernung, die zweite Zahl ist der Grad Markierung, dass das servo gedreht.

Möchte ich diese Daten aus und erstellt ein array, das wird Handlung, und aktualisieren Sie die Messung für jeden Grad, wie die servo-sweeps von 1-180 Grad und wieder von 180 Grad zu 1 Grad.

Hier ist mein code:

    using System;
    using System.IO.Ports;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;

    namespace SonarRadarProject
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                var comPorts = new string[10]; //You really shouldn't have many more than 10 ports open at a time.... Right?
                comPorts = SerialPort.GetPortNames();
                foreach (var comPort in comPorts)
                    listBoxComPorts.Items.Add(comPort);
                listBoxBaudRate.Items.Add(9600);
            }

            private void buttonConnect_Click(object sender, EventArgs e)
            {
                #region User Interface

                /*-------------------------------------------------------*
                 * --------------USER INTERFACE SECTION------------------*
                 *-------------------------------------------------------*/

                var userPortChoice = listBoxComPorts.SelectedItem;
                var userBaudChoice = listBoxBaudRate.SelectedItem;
                if ((userBaudChoice == null) || (userPortChoice == null))
                {
                    MessageBox.Show("Please select both a PORT and a BAUD rate.", "Error");
                    return;
                }
                SerialPort arduinoPort = new SerialPort()
                                             {
                                                 PortName = userPortChoice.ToString(),
                                                 BaudRate = Convert.ToInt16(userBaudChoice)
                                             };
                arduinoPort.Open();
                arduinoPort.NewLine = "\r\n";

                #endregion

                #region Real Code
                    /*-------------------------------------------------------*
                     * --------------THE REAL CODE SECTION-------------------*
                     *-------------------------------------------------------*/
                while (arduinoPort.IsOpen)
                {
                    //
                    //BEGIN making a string array based on serial data sent via USB from the Arduino UNO
                    //
                }
                #endregion
            }
        }
    }

Kann ich das array, und trennen Sie die Grad aus der Distanz-Messung (unter Verwendung von string.split und string.entfernen). Ich habe keine Ahnung, um diese Informationen kontinuierlich fließenden in aus der seriellen Schnittstelle (mit den Linien der Ausgang wird getrennt, und richtig formatiert) und die Aktualisierung meiner Variablen für diese Daten.

Brauche ich die Einführung einer handshake? Vielleicht Lesen diese Daten werden bit für bit, und kompilieren Sie es? Lesen Sie die inBuffer, statt arduinoPort.readLine()?

TLDR: ich will kontinuierlich aktualisiert werden (realtime?), richtig formatierte Daten Seriell, das kann ich trennen in zwei Variablen (sonarDist, und sonarDeg).

Machen Sie Ihre schlimmsten, ich bin ehrlich gesagt völlig verloren. Jede Beratung ist willkommen.

  • PS -Es ist nicht so, dass ich gar nichts in meinem "Echten Code", ich wurde wütend, nachdem ich immer debug "index out of range" Ausnahmen und zufälligen Müll outputs, wie z.B. "908123090;00000\r\n09812039890000\r\n". Ich markierte alles, gelöscht und geschlossen VS2012. Wahrscheinlich nicht meine beste Entscheidung. Posting hier war ein nachträglicher Einfall =(
  • Haben Sie dies Lesen, Beispiel - code.msdn.microsoft.com/windowsdesktop/...
  • Nein habe ich nicht! Danke. Wie würde ich meinen Arduino zu senden, ein stop-bit jedoch, oder ist es automatisch gesendet? Ich bin einfach davon ausgegangen das arduinoPort.NewLine = "\r\n" bestimmen würde das Ende der seriellen Leitung, und die nächste arduinoPort.ReadLine() würde den kick aus der nächsten Zeile, und dadurch als ein 'stop bit'. Ich bin nur ein Programmier-Bastler, sorry, wenn dies eine dumme Frage.
  • Blick auf meinen code in stackoverflow.com/questions/16335690/..., Es wird beschrieben, wie Sie die empfangenen Daten vom arduino in ein threadsicher Warteschlange. Das datareceived-handler erweitern ständig die empfangenen Zeichen an die Warteschlange, und dann nehmen Sie die Zeichen "" aus "" (dequeue) in Ihrem code auf Ihr Freizeit -, und ordnen Sie die Zeichen, um die Variablen.
  • Es gibt keine start-oder stop-bits gesendet werden, automatisch aus dem Arduino-board. Es sendet, was Sie sagen, es zu senden, so dass, wenn Sie Daten senden, ist es gut zu markieren Sie diese Daten irgendwie. Denke Protokolle. Ein Protokoll legt fest, wie Daten formatiert, bevor Sie die übertragung. Für die Arduino-der Anwender definiert das Protokoll. Für diese Frage sind die Daten, die gesendet werden könnten, in einer strukturierten Art und Weise, sagen wir [d:], wobei d die Entfernung und den Winkel und die Klammern [] sind Anfang und Ende der Daten gesendet (ein Datenpaket). Am empfangenden Ende wird es einfach zu zerlegen das Paket, wie es gesendet wird, in einer strukturierten Art und Weise.
  • Genial, ich werde versuchen, dies sobald ich die chance habe. Danke, ich denke, das sollte funktionieren =)

InformationsquelleAutor JesterBaze | 2013-06-20
Schreibe einen Kommentar