你好我在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);
答案 0 :(得分:1)
您的问题有点模糊,但是当端口在Windows上默认接收回车符和换行字节组合时,ReadLine()方法将返回。或者\ r \ n,或者0x0d 0x0a,如果你愿意的话。
如果您在第一个位置发送的'缓冲区'包含由\ r \ n分隔的多条消息,则ReadLine()将仅返回第一个消息,然后该端口将以您发布的C#代码关闭。 / p>
也许您的代码处于循环中,但未显示。
除此之外,在收到任何数据后,您将其转换回由ASCII编码确定的字节数组。你是在发送ASCII吗?如果没有,很可能你会丢失信息。
此外,如果您所做的只是将接收到的字符串转换为字节,那么您可以在第一时间以字节形式接收数据。
我认为您需要更详细地解释一下您发送的缓冲区中的内容,以及您收到的确切内容。
答案 1 :(得分:0)
我的大部分串口错误都是由糟糕的波特率设置引起的。这也可能是你的问题。 (您可以在SerialPort类的some constructors中设置波特率,或使用BaudRate property设置波特率