Проблема с получением данных формы последовательного порта в C #? - PullRequest
2 голосов
/ 07 июня 2010

привет, у меня проблема с получением данных от последовательного порта в 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();

но мой с ++ приемник работает отлично, я не знаю, в чем здесь проблема - работает код с ++

// 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 ]

1 голос
/ 08 июня 2010

Ваш вопрос немного расплывчатый, но метод ReadLine () вернется, когда порт получит комбинацию символов возврата каретки и перевода строки по умолчанию в Windows. Или \ r \ n, или 0x0d 0x0a, если вы предпочитаете.

Если «буфер», который вы отправляете на первом месте, содержит несколько сообщений, разделенных \ r \ n, тогда ReadLine () вернет только первое, а порт закроется в опубликованном вами коде C #.

Возможно, ваш код находится в цикле, но он не отображается.

Кроме того, после любых полученных вами данных вы преобразуете их обратно в массив байтов, определяемый кодировкой ASCII. Вы отправляете ASCII в первую очередь? Если нет, то, скорее всего, вам не хватает информации.

Кроме того, если все, что вы делаете, это преобразуете полученную строку в байты, вы можете просто получить данные в виде байтов.

Я думаю, вам нужно более подробно объяснить, что именно находится в буфере, который вы отправляете, и что именно вы получаете.

0 голосов
/ 07 июня 2010

Большинство моих ошибок последовательного порта вызваны неправильными настройками скорости передачи.Это тоже может быть вашей проблемой.(Вы можете установить скорость передачи в некоторых конструкторах класса SerialPort или с помощью свойства BaudRate )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...