Comment continue de lire des données en série de l'Arduino en C#, en bouclant pour actualiser la série.readExisting() données

Je suis avec mon Arduino UNO conseil d'administration à lire et à des points de l'intrigue sur un écran radar. Je suis la réception de données en série à mon PC qui ressemble à ceci:

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

Le premier nombre est la distance, le deuxième nombre est le degré de marqueur que le servo est tourné.

Je veux profiter de ces données et de créer un tableau qui va de la parcelle et d'actualisation de la mesure de chaque degré de plus que le servo des balayages de 1-180 degrés et à l'arrière de 180 degrés à 1 degré.

Voici mon 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
}
}
}

Je peux faire le tableau, et de séparer les Degrés de la mesure de Distance (à l'aide de cordes.split et de la chaîne.enlever). Je n'ai aucune idée de garder cette information en continu qui se jette dans le port série (avec les lignes de sortie séparés, et correctement mis en forme) et la mise à jour de mes variables pour ces données.

Dois-je introduire une poignée de main? Peut-être la lecture de ces données bit par bit et le compiler? Lire la inBuffer, au lieu de arduinoPort.readLine()?

TLDR: je veux continuellement mis à jour (en temps réel?), correctement mise en forme de données série, que je puisse séparer en deux variables (sonarDist, et sonarDeg).

Faire de ton mieux, je suis honnêtement complètement perdu. Tout conseil est le bienvenu.

  • PS -C'est pas que je n'avais rien dans mon "Vrai" Code de l'article, j'ai juste eu une folle après j'ai continué à obtenir de débogage "index out of range" exceptions et aléatoire d'ordures sorties comme "908123090;00000\r\n09812039890000\r\n". J'ai souligné tout, l'a supprimé, et fermé VS2012. Probablement pas ma meilleure décision. Poster ici était une réflexion après coup =(
  • Avez-vous lu cet échantillon code.msdn.microsoft.com/windowsdesktop/...
  • Non, je n'ai pas! Je vous remercie. Comment aurais-je obtenir mon Arduino pour envoyer un bit d'arrêt, cependant, ou est-il envoyé automatiquement? J'ai supposé que le arduinoPort.NewLine = "\r\n" permettrait de déterminer la fin d'une ligne série, et la prochaine arduinoPort.ReadLine() le coup de la ligne suivante, agissant ainsi comme un "bit de stop'. Je suis juste une programmation amateur, désolé si c'est une question stupide.
  • Regarde mon code dans le stackoverflow.com/questions/16335690/..., Il décrit comment ajouter des données reçues à partir de l'arduino dans un des threads en attente. Le datareceived gestionnaire de continuellement ajouter les caractères reçus de la file d'attente, et puis vous prenez les caractères "out" (file d'attente) dans votre code à votre guise, et d'attribuer les caractères variables.
  • Il n'y a pas de début ou de bits d'arrêt envoyé automatiquement à partir de la carte Arduino. Il envoie ce que vous lui demandez d'envoyer, de sorte que lorsque vous envoyez des données, il est bon de marque de ces données, en quelque sorte. Pensez protocoles. Un protocole définit comment les données sont formatées avant la transmission. Pour l'Arduino, l'utilisateur définit le protocole. Pour cette question en particulier, les données peuvent être envoyées de façon structurée, de dire [d:] où d est la distance et a est l'angle et les crochets [] sont de début et de fin de l'information transmise (un paquet de données). Sur la fin de réception, il sera facile à démonter le paquet est envoyé de manière structurée.
  • Génial, je vais essayer cela dès que j'ai de la chance. Merci, je pense que cela devrait fonctionner =)

InformationsquelleAutor JesterBaze | 2013-06-20