2016-02-19 1 views
-2

J'ai essayé d'arrêter la communication série avec port.Stop et port.Dispose() mais la communication ne s'arrête pas une fois établie.Communication série ne pas être arrêté avec la commande port.Stop

Voici mon code

Méthode de démarrage pour envoyer des données en continu jusqu'à ce que le port est ouvert

public void Start(List<byte> RGBdata) 
{   
    if (!m_port.IsOpen) 
    { 
     m_port.Open(); -- it fails over here when reloaded 
    }   
    do 
    { 
     Break(); 
     Thread.Sleep(5); 

     m_port.Write(new byte[] { 0 }, 0, 1); 
     SendData(RGBdata); 
     Thread.Sleep(1); 
    } 
    while (m_port.IsOpen()); 
} 

Méthode Pause

private void Break() 
    { 
     m_port.BreakState = true; 
     Thread.Sleep(1); 
     m_port.BreakState = false; 

    } 

SendData Méthode

private void SendData(List<byte> data) 
    {   

     m_port.Write(data.ToArray(), 0, data.Count); 
    } 

Méthode d'arrêt

public void Stop() 
{ 
    m_port.Close(); 

    if (m_port.IsOpen) 
    { 
     m_port.Close(); 
     m_port.Dispose(); 
    } 
} 
+0

Il y a quelques problèmes avec votre code. Pouvez-vous poster le code pour 'SendData' et' Break' aussi? – Stefan

+0

Votre mécanisme de synchronisation, 'Thread.Sleep 1 et 5', a des valeurs vraiment faibles. Normalement 'Thread.Sleep' a une résolution de ~ 30ms. – Stefan

+0

Il n'y a pas de multi-threading dans ce code. Etes-vous sûr d'utiliser plusieurs threads? Si pas 'while (m_port.IsOpen());' sera toujours vrai. Comme remarque, il vaut mieux lever un drapeau pour indiquer un arrêt. – Stefan

Répondre

0

Comme il est indiqué dans les commentaires, vous aurez besoin d'un fil et un indicateur de signal pour indiquer une condition d'arrêt:

d'abord créer un fil:

List<byte> gRGBdata; 
bool stopRequested = false; //signaler flag 
public void Start(List<byte> RGBdata) 
{  
    gRGBdata = RGBdata; //copy to "global" variable 

    //start thread 
    //reset flag first 
    stopRequested = false; 
    Thread t = new Thread (new ParameterizedThreadStart(yourThread)); 
    t.Start(); 
} 

et mettre en œuvre:

public void yourThread() 
{  
    if (!m_port.IsOpen) 
    { 
     m_port.Open(); -- it fails over here when reloaded 
    }   
    do 
    { 
     Break(); 
     Thread.Sleep(50); 

     m_port.Write(new byte[] { 0 }, 0, 1); 
     SendData(RGBdata); 
     Thread.Sleep(30); 
    } 
    while (!stopRequested); 

    if (m_port.IsOpen) 
    { 
     m_port.Close(); 
     m_port.Dispose(); 
    } 
} 

à la commande d'arrêt, le signal juste un drapeau:

public void Stop() 
{ 
    stopRequested = true; 
} 

Veuillez noter que la commande d'arrêt signale seulement. Les tampons seront vidés sur le port série. Si le drapeau est levé, la communication ne s'arrêtera pas instantanément mais il n'y aura pas de nouvelles commandes Send jusqu'à ce que vous soyez de nouveau Start.

Il y a encore beaucoup de problèmes dans ce code, mais j'espère que cela vous permettra de mieux comprendre comment utiliser le multithreading et les ports série. Fondamentalement: ne pas communiquer avec le port série (ou d'autres composants matériels de type singleton) à partir de différents threads. AVERTISSEMENT: ce code échouera si Start est appelé plusieurs fois lorsque la bande de roulement est encore active.

+0

Sure , Merci beaucoup Stefam, laissez-moi essayer ceci –

+0

Il y a encore beaucoup de corrections à faire, par exemple: vérifier un drapeau de coureur pour empêcher plusieurs départs de fil. Et puis, empêchant le scénario de clic rapide. Peut-être que certaines instructions 'lock' vous y aideront. – Stefan

+0

Non mon problème existe. J'ai tout implémenté, je ne suis pas capable d'arrêter la communication via le port. DiscardOutbuffer, DiscardInBuffer ne fonctionne pas. Et chaque fois que j'essaie d'accéder à nouveau au port, il dit que l'accès au port COM est refusé. J'ai besoin de retirer le câble USB encore et encore pour envoyer des données –