C# C中串行端口数据接收问题
我有一个C程序的问题。 通过串行端口,我收到一个大约110个字符的大字符串。 这部分工作正常,但是当我添加代码来拆分字符串时,在一些行之后会收到一个错误。 以下是我得到的错误: **mscorlib.dll中发生类型为“System.ArgumentOutOfRangeException”的未处理异常 附加信息:索引和长度必须引用字符串中的位置** 代码如下:C# C中串行端口数据接收问题,c#,C#,我有一个C程序的问题。 通过串行端口,我收到一个大约110个字符的大字符串。 这部分工作正常,但是当我添加代码来拆分字符串时,在一些行之后会收到一个错误。 以下是我得到的错误: **mscorlib.dll中发生类型为“System.ArgumentOutOfRangeException”的未处理异常 附加信息:索引和长度必须引用字符串中的位置** 代码如下: private void port_DataReceived(object sender, SerialDataReceivedEven
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的几行之后。。。大约1.5数据长度对于子字符串调用之一来说可能太短。在访问字符串中可能不存在的部分之前,请检查所需的字符串长度。数据长度可能太短,无法调用Substring。在访问可能不存在的字符串部分之前,请检查您期望的字符串长度。例外情况是,在某些情况下,子字符串的参数超过了字符串的长度。这可能意味着您无法从串行端口获得所需的数据。尝试在第一次调用Substring时插入断点,并检查数据内容,以确保正在读取的设备没有发送某种错误代码或与代码预期不同的内容。异常告诉您,在某个时刻,正在为子字符串指定超出字符串长度的参数。这可能意味着您无法从串行端口获得所需的数据。尝试在第一次调用Substring时插入断点,并检查数据内容,以确保您正在读取的设备没有发送某种错误代码或与代码预期不同的内容。在开始拆分字符串之前,您应该验证字符串的长度。在其中放入一个条件,以处理字符串小于预期值的情况,然后查看错误是否仍然存在 在开始拆分字符串之前,您应该验证字符串的长度。在其中放入一个条件,以处理字符串小于预期值的情况,然后查看错误是否仍然存在 在处理之前,您没有检查是否有足够的数据。只是 根据编码读取SerialPort对象的流和输入缓冲区中所有立即可用的字节
您的设备可能没有时间传递所有数据。因此,您需要重写逻辑以连接传入的数据,并在收到足够的数据后对其进行处理。在处理之前,您没有检查哪些数据足够。只是 根据编码读取SerialPort对象的流和输入缓冲区中所有立即可用的字节
您的设备可能没有时间传递所有数据。因此,您需要重写逻辑以连接传入的数据,并在收到足够的数据后对其进行处理。尝试对每个变量赋值进行长度检查,如下所示:
string acct = (data.length >= 81) ? data.Substring(76, 5) : string.empy;
data.length可能比子字符串76+5的总长度短。尝试对每个变量赋值进行长度检查,如下所示:
string acct = (data.length >= 81) ? data.Substring(76, 5) : string.empy;
data.length可能比子字符串76+5的总长度短。这是串行端口的典型行为。他们很慢。当DataReceived事件激发时,通常只能获得一个或两个字符。值得注意的是,它在调试时运行良好,因为单步执行代码会给串行端口大量时间来接收附加字符。但是,由于字符串不够长,在没有调试器的情况下运行时,它会立即停止 您需要通过将收到的字符串附加到类作用域的字符串变量来修改代码。仅在收到所有预期字符后才分析字符串。你需要知道你已经收到了完整的回复。大多数典型的串行设备将使用特殊字符终止字符串。通常是换行
如果是这种情况,则可以通过将SerialPort.NewLine属性设置为该终止符并调用ReadLine而不是ReadExisting来简化操作。这是串行端口的典型行为。他们很慢。当DataReceived事件激发时,通常只能获得一个或两个字符。值得注意的是,它在调试时运行良好,因为单步执行代码会给串行端口大量时间来接收附加字符。但是,由于字符串不够长,在没有调试器的情况下运行时,它会立即停止 您需要通过将收到的字符串附加到类作用域的字符串变量来修改代码。仅在收到所有预期字符后才分析字符串。你需要一些方法来知道你已经成功了 我得到了充分的答复。大多数典型的串行设备将使用特殊字符终止字符串。通常是换行
如果是这种情况,那么您可以通过将SerialPort.NewLine属性设置为该终止符并调用ReadLine而不是ReadExisting来简化操作。这个答案是正确的。我建议您通过查看堆栈跟踪消息来学习诊断bug。您会注意到这个错误与串行端口无关,而是与字符串操作有关。这个答案是正确的。我建议您通过查看堆栈跟踪消息来学习诊断bug。您将注意到,此错误与串行端口无关,而是与字符串操作有关。