Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 串行端口数据被复制或重新发送(某些字符)_C#_.net_Serial Port - Fatal编程技术网

C# 串行端口数据被复制或重新发送(某些字符)

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

让我解释一下场景:为我带来数据(字符串)的串行端口,如下例所示:

020510140009 M 0 741 30041105 2632 0 30041105

我尝试过各种读取(读取、读取字节、读取字符、读取行、读取现有内容)。我试图更改数据,但数据一直重复。看看上面的例子,现在看看数据是如何来的:

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;
            }
        }
[...]

经过深入研究,我发现这表明
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);
}