让我解释一下这个场景:带有数据的串口(字符串)如下例所示:
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;
}
}
[...]
答案 0 :(得分:0)
挖了我发现这个StackOverflow question / answer表明DataReceived
事件可能会在意外时间触发。所以,如果可能的话,你应该设置一个NewLine
并触发它。
作为对此想法的测试,您可以尝试添加按钮并等到知道您有一些数据,然后单击它以显示流。如果没有重复,则指向DataReceived
事件过度急切并且未正确触发。然后,您可以查看NewLine
,DtrEnable
和DsrHolding
等。
private void TestButton_Click(object sender, EventArgs e)
{
string indata = this.serialPort.ReadExisting();
MessageBox.Show(indata);
}
答案 1 :(得分:0)
我要尝试的第一件事是在每次调用data
方法后将ReadChar()
重置为空字符串,或者刷新输入缓冲区。
我怀疑对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
字符串并打破字符,将结果存储在全局变量中,然后重复使用左侧数据。