C# 串行端口数据被复制或重新发送(某些字符)
让我解释一下场景:为我带来数据(字符串)的串行端口,如下例所示: 020510140009 M 0 741 30041105 2632 0 30041105 我尝试过各种读取(读取、读取字节、读取字符、读取行、读取现有内容)。我试图更改数据,但数据一直重复。看看上面的例子,现在看看数据是如何来的: 0220510114 00009 M 0 741 300441105 2632 0 300411055 有人知道我如何解决这个问题吗 守则:C# 串行端口数据被复制或重新发送(某些字符),c#,.net,serial-port,C#,.net,Serial Port,让我解释一下场景:为我带来数据(字符串)的串行端口,如下例所示: 020510140009 M 0 741 30041105 2632 0 30041105 我尝试过各种读取(读取、读取字节、读取字符、读取行、读取现有内容)。我试图更改数据,但数据一直重复。看看上面的例子,现在看看数据是如何来的: 0220510114 00009 M 0 741 300441105 2632 0 300411055 有人知道我如何解决这个问题吗 守则: [...] try { this.serialPo
[...]
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;
}
}
[...]
经过深入研究,我发现这表明
DataReceived
事件可能会在意外时间触发。因此,如果可能的话,您应该设置一个换行符
,并触发它
作为对这一想法的测试,您可以尝试添加一个按钮,等待您知道您有一些数据,然后单击它以显示流。如果没有重复,则表明DataReceived
事件过急且触发错误。然后,您可能需要检查您的换行符
、DtrEnable
和DsrHolding
等
private void TestButton_Click(object sender, EventArgs e)
{
string indata = this.serialPort.ReadExisting();
MessageBox.Show(indata);
}
我要尝试的第一件事是在每次调用
ReadChar()
方法后,将数据
重置为空字符串,并刷新输入缓冲区
我怀疑对BytesToRead()
的调用返回的值大于零,而ReadChar()调用返回的是串行端口缓冲区上的原始字符。这是由于串行端口的内部计时,以及您的代码对于硬件设备可能“运行得太快”的事实
我可能会重新考虑方法中的整个while循环。您可能可以将其简化很多,只需尝试以下内容(使用自定义代码)
要更改换行符,只需检查
indata
字符串并中断字符,将结果存储在全局变量中,然后重新使用剩余数据。波特率、奇偶校验等设置是否正确?可能是连接出现问题,并尝试重新发送?我没有看到重复的数据。你知道串行数据是如何传输的吗?发布你的代码。@Ramhound:想进一步解释一下为什么字符串末尾的加倍的2
和加倍的5
是正常的吗?@ThorstenDittmar-显然作者得到的值是错误的,它不是正常的,但不是重复的数据。由于某种原因,会重新发送一个以上的字节。我怀疑处理字节读取方式的代码。既然我高度怀疑你知道答案,我就让你回答你自己的问题。在我向自己的否决票提供反馈后,我厌倦了在这个社区中人们对我的答案的否决票。@Ramhound:我明白了,我想你没有在消息中看到额外的2和5。“我已经尝试了各种读取(读取、读取字节、读取字符、读取行、读取现有数据)”@ViniciusOttoni-好的,我已经改变了我的答案,尝试了另一种想法,不再使用可靠的DataReceived事件!无法知道数据何时可用。=/所以,我放了一个线程,一直在请求是否有可用的数据,同样的事情,重复的字符=(当然,这从来都不是一个解决方案,只是想看看它是否会对你的问题有所帮助!你说线程,它是否和我在这里做的一样,所以只是抓取数据而不是太聪明?我需要放一个线程来获取所有可用的数据,因为我必须更新数据,这是一个在线系统。再次…重复字符。可能吗是否能够清除缓冲区中的最后一个字符?
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();
Console.WriteLine("Data Received:");
Console.Write(indata);
}