Vous pouvez utiliser l'événement DataReceived. Il sera déclenché chaque fois que de nouvelles données arrivent sur votre port. Vous devez vous inscrire pour comme ceci:
SerialPort port = new SerialPort(/*your specification*/);
port.DataReceived += Port_DataReceived;
Dans le gestionnaire d'événements alors vous lire les données entrantes
private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = sender as SerialPort;
if (port != null)
{
var incoming_message = port.ReadExisting();
}
}
Maintenant, il vous suffit d'ouvrir le port et écouterez automatiquement. REMARQUE! les données entrantes arrivent sur un thread différent du thread principal. Donc, si vous voulez utiliser les contrôles de votre formulaire pour l'affichage, vous devez utiliser BeginInvoke
Si vos données est marqué à la fin avec \n
vous pouvez essayer d'utiliser la méthode ReadLine
:
var incoming_message = port.ReadLine();
Ou vous pouvez essayer ReadTo
var incoming_message = port.ReadTo("\n");
EDIT:
Si c'est si longtemps, que vous devriez le lire en lots. Vous pouvez aussi essayer de le gérer en boucle.
private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = sender as SerialPort;
string message = "";
if (port != null)
{
while(port.BytesToRead > 0)
{
message += port.ReadExisting();
System.Threading.Thread.Sleep(500); // give the device time to send data
}
}
}
EDIT 2:
Si vous souhaitez stocker les données déclarent un List<string>
en dehors du gestionnaire d'événements et ajoutez la chaîne lorsqu'elle est entièrement lu.
List<string> dataStorage = new List<string>();
private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = sender as SerialPort;
string message = "";
if (port != null)
{
while(port.BytesToRead > 0)
{
message += port.ReadExisting();
System.Threading.Thread.Sleep(500); // give the device time to send data
}
// add now the entire read string to the list
dataStorage(message);
}
}
Depuis le gestionnaire d'événements ne sais pas si vous avez ou envoyer A
B
Accumulez l'ensemble des messages reçus dans une liste. Vous connaissez l'ordre dans lequel vous envoyez vos commandes, plus tard, vous pouvez prendre le message correspondant et utiliser Split
pour obtenir les 400 entrées dans un tableau:
string [] A_array_data = dataStorage[0].Split(" ");
Avez-vous un échantillon de code que vous pouvez nous montrer? –
en essayant d'ajouter du nouveau à stackoverflow – oakar
A l'intérieur de votre événement de fermeture de formulaire, vous pourriez peut-être essayer d'appeler 'Close()' sur le port série. Cela devrait débloquer l'appel en lecture si vous utilisez un BackgroundWorker, non? – nicholas