C#中接收串口数据的问题

时间:2010-10-15 16:18:29

标签: c#

我遇到了C#程序的问题。 通过串口我收到一个大约110个字符的大字符串。 这部分工作正常,但是当我添加代码拆分字符串时,我收到一些行后的错误。 这是我得到的错误:

** mscorlib.dll中发生了'System.ArgumentOutOfRangeException'类型的未处理异常

附加信息:索引和长度必须指代字符串中的位置。**

以下是代码:

private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
      if (!comport.IsOpen) return;

      if (CurrentDataMode == DataMode.Text)
      {
        // Read all the data waiting in the buffer
        string data = comport.ReadExisting();

        Log(LogMsgType.Incoming, data);
        string ziua = data.Substring(0, 8);
        string ora = data.Substring(8, 8);
        string linie = data.Substring(18, 1);
        string interior = data.Substring(22, 3);
        string durata1 = data.Substring(26, 4);
        string durata2 = data.Substring(30, 8);
        string nrtel = data.Substring(38, 10);
        string tipapel = data.Substring(75, 1);
        string acct = data.Substring(76, 5);


      }
      else
      {
        int bytes = comport.BytesToRead;

        byte[] buffer = new byte[bytes];

        comport.Read(buffer, 0, bytes);

        Log(LogMsgType.Incoming, ByteArrayToHexString(buffer));
      }
    }

编辑:

我测试了每个子串,所有这些都没问题。 字符串长度是112.它不能短。

此错误出现在几行112 ...大约一个半

之后

6 个答案:

答案 0 :(得分:4)

这是串行端口的典型行为。它们很慢。触发DataReceived事件时,通常只会获得一个或两个字符。值得注意的是,它在调试时运行良好,因为单步执行代码会使串行端口有足够的时间来接收其他字符。但是一旦没有调试器就会运行Kaboom,因为字符串不够长。

您需要通过将您收到的字符串附加到类范围的字符串变量来修改代码。只有在收到预期的所有字符后才解析字符串。您需要一些方法来了解您已收到完整的回复。大多数情况下,串行设备将使用特殊字符终止字符串。通常是换行。

如果是这种情况,那么您可以通过将SerialPort.NewLine属性设置为该终结符并调用ReadLine()而不是ReadExisting()来轻松实现。

答案 1 :(得分:2)

对于“Substring”的一个调用,“data”的长度可能太短。在访问可能不存在的部分字符串之前,请检查您期望的字符串长度。

答案 2 :(得分:2)

在处理之前,您不会检查您有足够的数据。 SerialPort.ReadExisting Method只是

  

根据编码,在SerialPort对象的流和输入缓冲区中读取所有立即可用的字节。

您的设备可能没有时间传递所有数据。因此,您需要重写逻辑以连接传入数据并在收到足够数据后对其进行处理。

答案 3 :(得分:0)

异常告诉您,在某些时候,Substring的参数超出了字符串的长度。这可能意味着您无法从串行端口获取预期的数据。尝试在第一次调用Substring时插入断点并检查data的内容,以确保您正在读取的设备没有发送某种错误代码或除代码期望之外的其他内容

答案 4 :(得分:0)

您应该在开始拆分之前验证字符串的长度。在那里放一个条件来处理字符串小于你期望的情况,然后看看错误是否仍然存在。

答案 5 :(得分:0)

尝试对每个变量赋值进行长度检查,如下所示:

string acct = (data.length >= 81) ? data.Substring(76, 5) : string.empy;

data.length可能比子字符串的总长度(76 + 5)短。