C# de série du problème de port - trop simple à l'échec, mais

Ok, ce doit être la saleté simple. Je suis en train de lire charactes à partir d'un périphérique série. C'est que si j'envoie un caractère d'espace, il les échos de retour d'une chaîne de chiffres et de fin de vie. C'est tout.

Je suis à l'aide de l'Unité 3.3 (.Net 2.0), et le "port série" est une série Prolifique à l'adaptateur USB. BTW: l'Utilisation d'Hyperterminal, tout fonctionne parfaitement, donc je sais que ce n'est pas de pilote ni de matériel.

Je peux ouvrir le port sur ok. Il semble que je peux envoyer mon espace avec le port.Write(" "); Mais même si je l'ai ESSAYER d'appeler ReadChar, ReadByte, ou ReadLine (comme d'interrogation), il se fige jusqu'à ce que je débranchez le câble USB, et ma sortie de la console ne montre rien (exceptions ont été pris).

Ainsi, au lieu-je configurer un DataReceviedHandler, mais il n'est jamais appelé.

J'ai lu quelques posts où les gens ont fait ce genre de chose avec des Arduinos etc. (ce n'est pas un Arduino mais bon), en utilisant rien de plus que de ReadLine. Leur code ne fonctionne pas pour moi (et pas de réponses, donc loin de ces auteurs).

Donc, des conseils? Dois-je utiliser un autre thread? Si vous connaissez n'importe quelle Unité (Mono) de codage, des conseils, le long de ces lignes grandement apprécié.

Ce code un mashup de http://plikker.com/?p=163 et http://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived.aspx#Y537

using UnityEngine;
using System.Collections;
using System.IO.Ports;
using System;

public class SerialTest : MonoBehaviour {

 SerialPort stream;

 void Start () {
  try {
   stream = new SerialPort("COM3", 9600);
   stream.Parity = Parity.None;
   stream.StopBits = StopBits.One;
   stream.DataBits = 8;
   stream.Handshake = Handshake.None;
   stream.DataReceived += new SerialDataReceivedEventHandler(DataReceviedHandler);


   stream.Open();
   Debug.Log("opened ok"); //it DOES open ok!
  } catch (Exception e){
   Debug.Log("Error opening port "+e.ToString()); //I never see this message
  }
 }

 void Update () { //called about 60 times/second
  try {
   //Read serialinput from COM3
   //if this next line is here, it will hang, I don't even see the startup message
   Debug.Log(stream.ReadLine());
   //Note: I've also tried ReadByte and ReadChar and the same problem, it hangs
  } catch (Exception e){
   Debug.Log("Error reading input "+e.ToString());
  }
 }

 private static void DataReceviedHandler(
                        object sender,
                        SerialDataReceivedEventArgs e)
 {
  SerialPort sp = (SerialPort)sender; //It never gets here!
  string indata = sp.ReadExisting();
  Debug.Log("Data Received:");
  Debug.Log(indata);
 }

 void OnGUI() //simple GUI
 {
   //Create a button that, when pressed, sends the 'ping'
   if (GUI.Button (new Rect(10,10,100,20), "Send"))
 stream.Write(" ");
 }
}
Vous devriez poster votre code, notamment dans le code où vous ouvrez l'appareil.
Le Code a été ajouté.
Pouvez-vous essayer dans l'autre sens, pouvez-vous vérifier que votre programme peut effectivement envoyer les choses à partir de ce port?
À l'aide de Serial Port Monitor, comme dirait ma 'ping' caractères pour obtenir envoyé, ou au moins SPM voit. Mais pas de données. Je l'ai fait avec Hyperterminal et il semble similaire, sauf que les données. Quelle est la diff? Quelqu'un sait comment lire les journaux?
Maintenant que vous avez posté votre code: Pourquoi avez-vous lu à partir du port série dans la méthode de mise à Jour, et pourtant s'attendre à voir quelque chose dans le gestionnaire d'événement? Est mise à Jour appelée 60 fois par seconde, même si le dernier appel n'a pas fini? Cela fonctionne si vous désactivez la mise à Jour de boucle? Et enfin, avez-vous essayer avec la plaine .NET sur Windows, juste pour être sûr?

OriginalL'auteur Dave | 2011-04-20