让我解释一下场景:串口给我带来数据(字符串)如下例:
02051014 0009 M 0 741 30041105 2632 0 30041105
我尝试了各种读取(读取、读取字节、读取字符、读取行、读取现有)。我试图改变 new line但数据保持重复。看看上面的例子,现在看看数据是怎么来的:
0220510114 00009 M 0 741 300441105 2632 0 300411055
有人知道我该如何解决这个问题吗?
代码:
[...]
try
{
this.serialPort = new SerialPort("COM1", 2400, Parity.None, 7, StopBits.One);
this.serialPort.DataReceived += new SerialDataReceivedEventHandler(portaSerial_DataReceived);
this.serialPort.Handshake = Handshake.XOnXOff;
this.serialPort.Encoding = Encoding.ASCII;
this.serialPort.Open();
}
[...]
private void portaSerial_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
var invalidValuesToBreakLine = new int[] { 13, 10, 0 };
int data;
while (this.serialPort.BytesToRead > 0)
{
data = this.serialPort.ReadChar();
if (invalidValuesToBreakLine.Contains(data))
{
if (!this.breakLineWasPerformed)
{
this.breakLineWasPerformed = true;
this.dataList.Add(this.temporaryString);
this.temporaryString = string.Empty;
}
}
else
{
if (this.breakLineWasPerformed)
{
this.breakLineWasPerformed = false;
}
this.temporaryString += (char)data;
}
}
[...]
最佳答案
我会尝试的第一件事是在每次调用 ReadChar()
方法后将 data
重置为空字符串,或者刷新输入缓冲区。
我怀疑对 BytesToRead()
的调用返回的值大于零,而 ReadChar() 调用返回的是串行端口缓冲区中的原始字符。这是由于串行端口的内部时序,以及您的代码对于硬件设备可能“运行得太快”这一事实。
我可能会重新考虑方法中的整个 while 循环。您可能可以将其简化很多,只需尝试以下操作(使用您的自定义代码)
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(indata);
}
要更改换行符,只需检查 indata
字符串并中断字符,将结果存储在全局变量中,然后重用剩余的数据。
关于c# - 串行端口数据重复或重新发送(一些字符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14708011/