2012-10-09 1 views
0

Je travaille dans un thread pour vérifier la connexion GPRS dans CompactFramework.serialPort.DataReceived en cours d'exécution dans le thread ne fonctionne pas

L'idée du fil est simple: Si le programme n'est pas connecté, alors je cours le code pour se connecter (ce code me donne des erreurs), mais si la connexion est OK alors je revérifie dans 60 secondes et ainsi sur.

Maintenant, en mettant l'accent sur le code de connexion. Le code suivant vérifie s'il est connecté ou non, si ce n'est pas le cas, je m'abonne à l'événement DataReceive.

void initFormText() 
{ 
    if (isThereConnect()) //true if it is connected 
    { 
     //enable timer to recheck if it's connected 
    } 
    else //it isn't connected 
    { 

     serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived); 
     if (serialPort1.IsOpen) 
     { 
      serialPort1.Close(); 
     } 
     serialPort1.Open(); 

     timerStep.Enabled = true; 
    }  
} 

Maintenant vient la question, dans le serialPort1_DataReceived je vérifie les données et définir une variable qui est testée par le timerStep et faire quelques pas.

Le problème se produit en cas DataReceived, la chose est que quand je lance le code suivant à l'extérieur d'un fil, il fonctionne très bien, il fait tout le travail et faire le lien, mais dans le fil il doesn ne fonctionne pas. Je l'ai testé en ajoutant quelques MessageBox et je me rends compte que ceux qui se trouvent dans le DataReceive n'apparaissent jamais.

void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) 
{ 
    byte[] data = new byte[1024]; 
    int n = serialPort1.Read(data, 0, data.Length); 
    string rec = Encoding.GetEncoding("windows-1252").GetString(data, 0, n); 

    if (string.IsNullOrEmpty(rec)) 
    { 
     return; 
    } 

    if (rec.Contains("AT+CIMI") && rec.Contains("OK")) 
    { 
     MessageBox.Show("serialPort 1"); 
     currState = 1; 
    } 
    else if (rec.Contains("READY")) 
    { 
     MessageBox.Show("serialPort 11"); 
     currState = 1; 
    } 
    else if (rec.Contains("0,1") || rec.Contains("0,5")) 
    { 
     MessageBox.Show("serialPort 2"); 
     currState = 2; 
    } 
} 

Donc, pour une raison quelconque, serialPort ne reçoit rien et je n'arrive pas à comprendre pourquoi. Le fait que cela fonctionne en dehors du fil mais pas dans le fil me frustrent.

J'apprécie toute aide. Merci d'avance!

Répondre

1

Oui, mais je pense que votre thread se termine avant que l'événement ne soit déclenché. Vous devriez créer votre formulaire de la manière suivante, veuillez noter que ceci est du code pour le bureau mais simule ce qui est disponible dans CompactFramework puisque je ne l'ai pas installé ici. First Form1 est le formulaire principal et il commence thread dans lequel est le Form2. Le Form2 a un bouton et Click EventHandler qui fonctionne, mais vous devez montrer votre Form2 avec Application.Run(). Voici l'exemple de code:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Thread thread = new Thread(new ThreadStart(ThreadMethod)); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start(); 
    } 
    void ThreadMethod() 
    { 
      Form2 f = new Form2(); 
      Application.Run(f); 
    } 
} 

public partial class Form2 : Form 
{ 
    public Form2() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("Something"); 
    } 
} 

Espérons que cela fonctionnera de cette façon.

+0

Merci l'homme !!! avec Application.Run fonctionne très bien! Merci beaucoup pour votre aide! –

1

L'événement doit s'exécuter dans le même thread (je suppose que le thread UI) où vous avez déjà déclaré serialPort1. Vous pouvez exécuter le code à partir de l'événement serialPort1_DataReceived dans un thread différent. Ce thread doit être démarré par le gestionnaire d'événements serialPort1_DataReceived. Le problème est que CompactFramework n'a pas ParameterisedThreadStart de sorte que vous ne pouvez pas transmettre efficacement les données reçues au thread. Vous devrez définir un champ global en utilisant des délégués.

+0

Mon port série est déclaré dans un WinForm et le thread exécute le formulaire de trou. Cela ne devrait donc pas être le problème, n'est-ce pas? –

+0

Est-ce que je vous comprends bien, vous avez un WinForm dans Thread istantiated dans un autre formulaire? –

+0

oui, c'est le cas. J'ai un formulaire principal permet de dire et celui-ci instancier un fil qui fonctionne mon formulaire GPRS –

Questions connexes