开发者

Problem with receiving data form serial port in c#?

开发者 https://www.devze.com 2023-01-02 07:34 出处:网络
hello i have problem with receiving data from serial port in c# in am inserting a开发者_开发问答 new line operator at the end of data buffer. then i send this data buffer on serial port, after this my

hello i have problem with receiving data from serial port in c# in am inserting a开发者_开发问答 new line operator at the end of data buffer. then i send this data buffer on serial port, after this my c# GUI receiver will take this data via Readline() function but it always give me raw data not the actual one how to resolve this problem.

//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();

but my c++ receiver is working perfectly i dont know what is the problem here is working 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);


Your question is a bit vague, but the ReadLine() method will return when the port receives a carriage return and line feed byte combination by default on Windows. Or \r\n, or 0x0d 0x0a if you prefer.

If the 'buffer' you are sending in the fist place contains several messages delimited by \r\n, then ReadLine() will only return the first one, then the port will close in the C# code you have posted.

Maybe your code is in a loop, but it is not shown.

Beyond that, after any data that you have received, your are converting it back to an array of bytes, determined by ASCII encoding. Are you sending ASCII in the first place? If not, it is likely that you could be missing information.

Also, if all you do is convert the received string into bytes, you could just receive the data as bytes in the first place.

I think you need to explain in a bit more detail exactly what is in the buffer you are sending, and what exactly do you receive.


Most of my serial port errors are caused by bad baude rate settings. This might be your problem too. (You can set the baude rate in some constructors of the SerialPort class, or with the BaudRate property)

0

精彩评论

暂无评论...
验证码 换一张
取 消