Aide Port série .NET requis, principalement avec les données reçues dans plusieurs « paquets »

StackOverflow https://stackoverflow.com/questions/891475

  •  23-08-2019
  •  | 
  •  

Question

Je suis très nouveau pour l'envoi de données via un port série via .net et je l'ai remarqué après la mise en œuvre d'une contrepartie TCP que je ne l'obtenir facile avec série!

Donc, pour commencer au sommet, je suis presque avec ma mise en œuvre de la communication bidirectionnelle série je suis juste rester coincé sur quelques petites choses: -

  1. Mon lit sont partagés entre divers messages ou reçus en réponse fragmentée sur le port COM et je ne sais pas quels paramètres je pourrais avoir besoin, ou comment je devrais écrire le code différemment pour résoudre ce problème. Ce qui pourrait être la cause? J'inspectais le message à un point d'arrêt sur SerialPort_DataReceived.

Fondamentalement, les données doivent être envoyées sous forme de:

01: LS|DA090521|TI111043|q
02: PS|RN102|PTC|TA1040000|P#0|DA090521|TI111429|j

mais il est divisé (à des positions aléatoires sur chacun présenté une demande READ)

01: LS|DA090521|TI111
02: 043|q
03: PS|RN102|PTC|TA1
04: 0000|P#0|DA090521|TI111429|j

- Question 1 a reçu une réponse, merci Chris W. et d'autres! J'ai maintenant le message que je pense être construit à partir de fragments progressivement (recherche pour STX, {corps msg}, ETX), puis une action effectuée lorsque le message a été entièrement construit, et a obtenu va avec une file d'attente de thread-safe, très heureux .

. 2. Je reçois un « | » symbole par ma lecture presque chaque cycle, est-ce dû à une commande que je l'ai mal réglé en quelque sorte, un artefact de communication série, ou quelque chose de l'appareil me envoie? (Je ne pense pas que, comme la connectivité Hyperterminal révèle ce caractère ne sont pas envoyées en continu.)

. 3. Pouvez-vous confirmer que je suis en train de lire et d'écrire des données correctement dans les méthodes respectives.

Merci les gars pour regarder mes deux autres questions aussi.

Code pertinent comme suit:

...
    //                          COM3,    9600,     None,   8,        One
    SerialPort = new SerialPort(comPort, baudRate, parity, dataBits, stopBits);
    if (SerialPort.IsOpen) SerialPort.Close();
    // SerialPort.RtsEnable = true; // Request-to-send
    // SerialPort.DtrEnable = true; // Data-terminal-ready
    SerialPort.ReadTimeout = 150; // tried this, but didn't help
    SerialPort.WriteTimeout = 150; // tried this, but didn't help
    SerialPort.Open();

    SerialPort.DataReceived += new SerialDataReceivedEventHandler(SerialPort_DataReceived);
}

void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
    // Process received data
    SerialPort sp = (SerialPort)sender;
    byte[] buffer = new byte[sp.BytesToRead];
    int bytesRead = sp.Read(buffer, 0, buffer.Length);

    // message has successfully been received
    message = Encoding.ASCII.GetString(buffer, 0, bytesRead);
}

public bool SendMessage(string text)
{
    // Only send message if a client is connected
    if (SerialPort != null && SerialPort.IsOpen)
    {
        byte[] buffer = Encoding.ASCII.GetBytes(text);
        SerialPort.Write(buffer, 0, buffer.Length);
    }
}
Était-ce utile?

La solution

  

Mon lit comme suit sont en cours réparti sur plusieurs messages

Ceci est normal, attendu, le comportement inévitable. Il peut arriver avec des données sur TCP ainsi. Pour l'interface série, il est juste un flot ininterrompu d'octets. Il est de la responsabilité de l'application de reconditionner ces octets en paquets.

Si l'emplacement des limites de paquets est important, et si vous ne pouvez pas dire où les limites de paquets sont censés être de regarder les données reçues, vous devrez peut-être repenser le format des données afin que vous peut dire où les limites de paquets sont.

  

Je reçois un « | » symbole par ma lecture presque chaque cycle

Quelle est la valeur hexadécimale de ce personnage? Voir si le réglage de la propriété Handshake à XOnXOff ou RequestToSendXOnXOff améliore la situation.

Autres conseils

Au niveau inférieur port série peut décider quand déclencher les données reçues événement. Il peut décider de le faire avant que le paquet « complet » est arrivé. Mais, il semble que vous avez un caractère de terminaison dans votre ensemble de données attendu. Si oui, vous pouvez faire ce qui suit (note que j'ai changé l'affectation SerialPort pour éviter toute confusion de syntaxe:

        p = new SerialPort(PortName, BaudRate, Prty, DataBits, SBits);
        p.NewLine = Terminator;

où Terminator est une chaîne contenant votre caractère de terminaison (s). Ensuite, vous pouvez utiliser SerialPort.ReadLine () (et SerialPort.WriteLine () si cela s'applique). Cela pourrait au moins aider à votre première question.

Je l'ai fait beaucoup de programmation de port série Win32, mais juste un peu avec .NET, afin de prendre mes conseils avec un grain de sel.

  

Mon lit comme suit sont en cours réparti sur plusieurs messages ou reçus en réponse fragmentée sur le port COM et je ne sais pas quels paramètres je pourrais avoir besoin, ou comment je devrais écrire le code différemment pour résoudre ce problème.

Comme d'autres l'ont dit, cela est parfaitement normal. En fonction de ce type d'équipement est sur le côté DCE, vous devrez peut-être vous faire remballer. Je ne sais pas quel type d'équipement que vous êtes accroché à donc je ne peux pas vraiment dire beaucoup plus.

Si vous souhaitez obtenir plus de données, vous pouvez essayer ce qui suit:

  • ajuster la propriété System.Int32 ReceivedBytesThreshold
  • à l'aide d'E / S synchrone et en spécifiant un nombre fixe d'octets à lire au lieu de réception basée sur les événements
  

Je reçois un « | » symbole par ma lecture presque chaque cycle, est   ce en raison d'une commande que j'ai mis   à tort en quelque sorte, un artefact de série   communication, ou quelque chose du dispositif   me envoie? (Je ne pense pas   cependant, que la connectivité Hyperterminal   révèle ce caractère est de ne pas   envoyé en continu.)

Si vous êtes curieux de savoir ce qui se passe sur la ligne, consultez PortMon de SysInternals , une application gratuite qui snoop votre port com pendant que vous transférez des données sur la ligne. Il semble technique, mais vraiment vous avez juste à regarder le IRP_MJ_WRITE et les commandes IRP_MJ_READ, et sur la ligne que vous verrez la longueur en octets et les données envoyées sur le fil. Avec cela, vous devriez être en mesure de dire si le problème est l'objet SerialPort .NET ou si l'appareil envoie effectivement « | » sur la ligne.

  

Pouvez-vous confirmer que je lis et   écrire correctement les données dans le   procédés respectifs.

Il semble bon pour la méthode basée sur les événements de réception de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top