在c#中从串口接收数据的问题?

时间:2010-06-07 08:21:09

标签: c# c++ c windows

你好我在c#中从串口接收数据时遇到问题,我在数据缓冲区的末尾插入一个新的行操作符。然后我在串口发送这个数据缓冲区,之后我的c#GUI接收器将通过Readline()函数获取这些数据,但它总是给我原始数据而不是实际的数据如何解决这个问题。

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

但我的c ++接收器工作正常我不知道这里的问题是工作c ++代码

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

2 个答案:

答案 0 :(得分:1)

您的问题有点模糊,但是当端口在Windows上默认接收回车符和换行字节组合时,ReadLine()方法将返回。或者\ r \ n,或者0x0d 0x0a,如果你愿意的话。

如果您在第一个位置发送的'缓冲区'包含由\ r \ n分隔的多条消息,则ReadLine()将仅返回第一个消息,然后该端口将以您发布的C#代码关闭。 / p>

也许您的代码处于循环中,但未显示。

除此之外,在收到任何数据后,您将其转换回由ASCII编码确定的字节数组。你是在发送ASCII吗?如果没有,很可能你会丢失信息。

此外,如果您所做的只是将接收到的字符串转换为字节,那么您可以在第一时间以字节形式接收数据。

我认为您需要更详细地解释一下您发送的缓冲区中的内容,以及您收到的确切内容。

答案 1 :(得分:0)

我的大部分串口错误都是由糟糕的波特率设置引起的。这也可能是你的问题。 (您可以在SerialPort类的some constructors中设置波特率,或使用BaudRate property设置波特率