2010-09-09 25 views
1

J'ai un programme de port série simple qui est censé lire le port série et renvoyer les caractères saisis. Je peux obtenir ce bon fonctionnement en interrogeant la série reçue avec une minuterie, mais je voudrais utiliser l'événement dataReceived à la place. Pour une raison quelconque, l'événement se produira une fois mais jamais plus.dataReceived event in .net compact 2.0 pour Windows CE 6.0 ne fonctionne qu'une seule fois pour la communication série

SerialPort bsp; 
    public Form1() 
    { 
     InitializeComponent(); 
     bsp = new SerialPort("COM2", 2400, Parity.None, 8, StopBits.One); 
     bsp.DataReceived +=new SerialDataReceivedEventHandler(whasup); 
     System.Threading.Thread.Sleep(1000); 
     bsp.Open(); 
    } 
    void whasup(object sender, SerialDataReceivedEventArgs e) 
    { 
     char[] text = new char[100]; 
     int temp = bsp.BytesToRead; 
     string j = temp.ToString(); 
     bsp.Read(text, 0, temp); 
     bsp.Write(text, 0, temp); 
    } 

J'ai essayé le portage à un PC et il fonctionne très bien, mais sur ce périphérique Windows CE, il ne veut vraiment pas coopérer. Je sais que l'objet série est toujours ouvert parce que j'ai eu une minuterie qui exécute le texte de crachement sur le périphérique Win CE, même après qu'il cesse de renvoyer ses données de réception. J'ai également eu la sortie de la minuterie bsp.BytesToRead, et je pouvais voir cette valeur grimper comme j'ai tapé plus de clés sur mon PC qui a parlé en série à l'appareil Windows CE. Est-ce que je manque quelque chose?

Répondre

0

Nous avons souffert des problèmes similaires avec Read() mais géré avec ReadExisting() à la place, pour toujours lire le tampon entier. C'est peut-être ce fait qui permet d'élever le prochain événement.

Le Sleep(500) a été inclus car l'événement est déclenché dès que le premier octet est écrit dans le tampon. Grâce à un essai/une erreur et en sachant que les messages que nous lisions ne dépassaient jamais une longueur particulière, nous savions qu'ils seraient entièrement écrits à l'intérieur (et en fait longtemps avant) de 500ms de l'événement.

Un peu hit/miss et je serais plus qu'heureux de voir une solution «correcte» d'un expert en série!

Le code:

private SerialPort port; 
private object readLock = new object(); 

private SerialManager() 
{ 
    port = new SerialPort(SerialPort, BaudRate, Parity.None, 8, StopBits.One); 
    port.Handshake = Handshake.None; 
    port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived); 
    port.Open(); 
} 

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e) 
{ 
    // Lock to subsequent DataReceived events 
    lock (readLock) 
    { 
     Thread.Sleep(500); 
     string data = port.ReadExisting(); 
    } 
}