2010-06-07 8 views
2

bonjour j'ai un problème avec la réception de données du port série dans C# dans l'insertion d'un nouvel opérateur de ligne à la fin du tampon de données. alors j'envoie ce tampon de données sur le port série, après cela mon récepteur de C# GUI prendra ces données via la fonction Readline() mais il me donne toujours des données brutes pas la réelle comment résoudre ce problème.Problème lors de la réception du port série du formulaire de données dans C#?

//configuring the serial port this code in c# with problem 
       serialPort.PortName = "COM1"; 
       serialPort.BaudRate = 9600; 
       serialPort.DataBits = 8; 
       serialPort.Parity = Parity.None; 
       serialPort.StopBits = StopBits.One; 

       //opening the serial port 
       if(!serialPort.IsOpen) 
        serialPort.Open(); 

       //read 2byte data for msG code from serial port 


       string strReadData=serialPort.ReadLine(); 
       char[] temp=new char[350]; 
       //strReadData.CopyTo(1, temp, 0, strReadData.Length - 2); 

       //strReadData = temp.ToString(); 

       //string strReadData = serialPort.ReadExisting(); 

       //strReadData.Replace(' ', '\0'); 

       //strReadData.Replace(' ', ''); 

       byte[] RecievedData = Encoding.ASCII.GetBytes(strReadData); 

       RecievedDataDecoder(RecievedData); 


//close the port 
       if(serialPort.IsOpen) 
        serialPort.Close(); 

mais mon C++ récepteur fonctionne parfaitement je ne sais pas quel est le problème ici fonctionne C++ Code

// variables used with the com port 
BOOL  m_bPortReady; 
HANDLE m_hCom; 
DCB  m_dcb; 
COMMTIMEOUTS m_CommTimeouts; 
BOOL  bWriteRC; 
BOOL  bReadRC; 
DWORD iBytesWritten; 
DWORD iBytesRead; 
DWORD dwCommEvent; 
DWORD dwRead; 

char  sBuffer[128]; 

m_hCom = CreateFile("Com1", 
     GENERIC_READ | GENERIC_WRITE, 
     0, // exclusive access 
     NULL, // no security 
     OPEN_EXISTING, 
     0, // no overlapped I/O 
     NULL); // null template 

m_bPortReady = SetupComm(m_hCom, 128, 128); // set buffer sizes 

m_bPortReady = GetCommState(m_hCom, &m_dcb); 
m_dcb.BaudRate = 9600; 
m_dcb.ByteSize = 8; 
m_dcb.Parity = NOPARITY; 
m_dcb.StopBits = ONESTOPBIT; 
m_dcb.fAbortOnError = TRUE; 

m_bPortReady = SetCommState(m_hCom, &m_dcb); 

m_bPortReady = GetCommTimeouts (m_hCom, &m_CommTimeouts); 

m_CommTimeouts.ReadIntervalTimeout = 50; 
m_CommTimeouts.ReadTotalTimeoutConstant = 50; 
m_CommTimeouts.ReadTotalTimeoutMultiplier = 10; 
m_CommTimeouts.WriteTotalTimeoutConstant = 50; 
m_CommTimeouts.WriteTotalTimeoutMultiplier = 10; 

m_bPortReady = SetCommTimeouts (m_hCom, &m_CommTimeouts); 


    if (!SetCommMask(m_hCom, EV_RXCHAR)) 
    { 
     printf("Error in set comm mask"); 
    } 

while(1) 
{ 

    if (WaitCommEvent(m_hCom, &dwCommEvent, NULL)) 
    { 
     if (ReadFile(m_hCom, &sBuffer, 128, &iBytesRead, NULL)) 
      printf(""); 

     else 
     { 
     printf("Error in reading"); 
     break; 
     } 
    } 
    else 
    { 
    printf("Error in Waiting"); 
     break; 
    } 


    printf("%s",sBuffer); 
    strcpy(sBuffer,""); 

} 


CloseHandle(m_hCom); 
getch(); 
exit(0); 
+0

Pouvons-nous voir du code? –

+0

Que voulez-vous dire par «données brutes» plutôt que par données «réelles»? –

+0

je ne peux pas recevoir des données dans le même ordre que j'écris dans le port série il est dans les morceaux pas sous la forme de tampon de données – Badr

Répondre

1

Votre question est un peu vague, mais la méthode ReadLine() retourne lorsque le port reçoit une combinaison de retour chariot et saut de ligne octet par défaut sur Windows. Ou \ r \ n, ou 0x0d 0x0a si vous préférez. Si le 'buffer' que vous envoyez au premier poing contient plusieurs messages délimités par \ r \ n, alors ReadLine() ne retournera que le premier, alors le port se fermera dans le code C# que vous avez posté. Peut-être que votre code est en boucle, mais il n'est pas affiché.

Au-delà de cela, après toutes les données que vous avez reçues, vous le convertissez en un tableau d'octets, déterminé par le codage ASCII. Est-ce que vous envoyez ASCII en premier lieu? Si non, il est probable que vous pourriez manquer des informations. En outre, si tout ce que vous faites est de convertir la chaîne reçue en octets, vous pouvez simplement recevoir les données sous forme d'octets en premier lieu.

Je pense que vous avez besoin d'expliquer avec un peu plus de détails exactement ce qui est dans le tampon que vous envoyez, et qu'est-ce que vous recevez exactement.

+0

ok merci ça aide j'ai résolu le problème. – Badr

+0

Heureux que cela a aidé. Quel était le problème? – Andy

0

La plupart de mes erreurs de port série sont causées par des mauvais réglages de taux Baude. Cela pourrait être votre problème aussi. (Vous pouvez définir le taux Baude dans some constructors de la classe SerialPort, ou avec le BaudRate property)

+0

ont tous les deux le même débit en bauds et la taille des octets de données. – Badr

Questions connexes