2013-06-04 2 views
0

J'ai plusieurs périphériques série connecté à mon PC et je travaille sur un programme qui permet aux utilisateurs de sélectionner autant que les ports qu'ils veulent et le programme sera crée dynamiquement TabPage et les ajoute à TabControl .dynamiquement créé SerialPort cesse de répondre sans erreur

Chaque onglet aura également une zone de texte multiligne qui montrera les données entrantes de la serialport qui lui est attribué.

Voici mon code qui tente de créer ces contrôles dynamiquement:

private void AddSerialPort(string portName) 
{ 
    var page = new TabPage(portName); 

    page.Text = portName; 

    var tb = new TextBox(); 
    tb.Name = portName; 
    tb.Dock = DockStyle.Fill; 
    tb.BackColor = Color.Black; 
    tb.ForeColor = Color.White; 
    tb.Multiline = true; 
    page.Controls.Add(tb); 
    tabControlActiveSerialPorts.TabPages.Add(page);  

    //Define serial port 
    var sp = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One);     

    sp.DataReceived += delegate 
    { 
     if (tb.InvokeRequired) 
     { 
      tb.Invoke(new Action(() => 
      { 
       var incoming = sp.ReadExisting(); 
       tb.Text += incoming;     
      })); 
     } 
     else 
     { 
      var incoming = sp.ReadExisting(); 
      tb.Text += incoming; 
     } 
    }; 

    sp.Open(); 
} 

Le problème est, si j'ajouter qu'un seul SerialPort, il fonctionne très bien et est rempli zone de texte. Mais dès que j'ajoute un autre SerialPort, Après quelques secondes, le premier ou le deuxième SerialPort ajouté cessera de fonctionner, tandis que l'autre fonctionnera toujours (c'est complètement aléatoire soit le premier ou le deuxième arrêt remplissant les données dans la zone de texte, mon matériel!) Je veux dire la boîte de texte que ce qui a désigné pour elle ne sera plus rempli.

Je le fais juste ne recevoir aucune erreur de débogueur ... fonctionne pas! Une idée de ce que peut être le problème?

Je dois mentionner que si j'ajoute seulement 1 port série, cela fonctionne bien! J'ai essayé BeginInvoke au lieu de Invoke mais cela n'a rien changé.

Répondre

1

Il se pourrait que les objets SerialPort obtenir disposés. Essayez d'ajouter chaque nouvel objet à la liste:

class Class 
{ 
    List<SerialPort> ports = new List<SerialPort>(); 

    private void AddSerialPort(string portName) 
    { 
     ... 
     var sp = new SerialPort(portName, 115200, Parity.None, 8, StopBits.One); 
     ports.Add(sp); 
     ... 
    }  
} 
+0

Cela semble prendre en charge le problème !!! Je voulais faire la même chose: D merci quand même! –

Questions connexes