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

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

** mscorlib.dll中出现未处理的“System.ArgumentOutOfRangeException”类型exception

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

这是代码:

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行……大约一行半之后

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

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

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

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

在处理之前,您不会检查您有足够的数据。 SerialPort.ReadExisting方法就好了

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

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

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

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

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

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

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