当前位置:编程学习 > C#/ASP.NET >>

使用serialport类,如何判断接收的数据已经中断?

之前发过一次贴,简单测试以为可以了,实际还是不行。
具体要求如下:
    使用serialport类接收串口数据(串口数据是由与计算机相连的一台仪表以固定格式连续发送的),现在接收数据已正常,但是不知怎样判断串口数据已中断。(此处我所说的串口数据中断,是指由于串口rs232连接线路中断,或与计算机连接的仪表已关闭停止向计算机发送数据)。
    之前发帖求助,得到的用serialPort.BytesToRead=0 得到缓冲字节长度,只能在serialPort打开时判断有效,如果起初接收正常,突然中断了串口的数据传输,用这个方法依旧不能得到正确结果。 --------------------编程问答-------------------- if(serialPort.BytesToRead==0) --------------------编程问答-------------------- 将上面的语句放在 serialPort1_DataReceived事件当中, --------------------编程问答--------------------  private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte r_byte;
            while (serialPort1.BytesToRead != 0)
            {
                r_byte = Convert.ToByte(serialPort1.ReadByte());
                switch (r_flag)
                {
                    case 0:
                        if (r_byte == 0xaa)
                        {
                            r_flag += 1;
                            serial_input[0] = r_byte;
                        }
                        break;
                    case 1:
                        if (r_byte == 0xaa)
                        {
                            r_flag += 1;
                            serial_input[1] = r_byte;
                            r_count = 0;
                        }
                        else
                        {
                            r_flag = 0;
                            r_count = 0;
                        }
                        break;
                    case 2:
                        serial_input[r_count + 2] = r_byte;
                        r_count += 1;
                        if (serial_input[2] != 0xd0)
                        {
                            if (r_count == 4)
                            {
                                r_flag = 0;
                                r_count = 0;
                                rs_cl();//调用接收处理函数
                            }
                        }
                        else
                        {
                            if (r_count == 0x14)
                            {
                                r_flag = 0;
                                r_count = 0;
                                rs_cl();//调用接收处理函数
                            }

                        }
                        break;
                }
            }
        } --------------------编程问答-------------------- 学习 --------------------编程问答--------------------
引用 1 楼 baihe_591 的回复:
if(serialPort.BytesToRead==0)

这个方法我用了,代码如下:
在serialPort_DataReceived事件中:
try
{
                if (czSerialPort.BytesToRead == 0)
                {
                    strczData = "Error";
                }
                else
                {
                    //定义接收数据长度
                    int bytesRead = czSerialPort.BytesToRead;
                    byte firstbyte = Convert.ToByte(czSerialPort.ReadByte());
                    //判断第一个字节是否是起始位:16进制的0x02
                    if (firstbyte == 0x02)
                    {
                        byte[] bytesData = new byte[bytesRead];
                        for (int i = 0; i <= bytesRead - 2; i++)
                        {
                            byte byteData = Convert.ToByte(czSerialPort.ReadByte());
                            //判断数据结束字节
                            if (byteData == 0x03)
                                continue;
                            bytesData[i] = byteData;
                        }
                        //将字节数组转换成字符串
                        strczData = System.Text.Encoding.Default.GetString(bytesData);
                        //截取数据(舍去校验和等字符)
                        strczData = strczData.Remove(7);
                        //通过捕获异常来转换接收到的字符串
                        try
                        {
                            int intczData = Convert.ToInt32(strczData);
                            strczData = Convert.ToString(intczData);
                        }
                        catch
                        {
                            strczData = "Error";
                        }
                    }
}
catch (exection czerror)
{
    MessageBox.Show(czerror.Message);
}

在代码中加入了你说的判断仍旧不行。 --------------------编程问答-------------------- 实时检查连接标志位,异常断开时就读取数据,这样行吗 --------------------编程问答-------------------- 你可以可以用API写,这样就有延时参数可以用了 --------------------编程问答-------------------- 晕老在这个问题你还没解决??
做个标记明天给你个点代码。 --------------------编程问答-------------------- SERIALPORT_DATARECEIVED 怎么触发啊,我的每次都不执行啊?
--------------------编程问答-------------------- mark,明天过来学习代码 --------------------编程问答-------------------- 好 --------------------编程问答--------------------
引用 8 楼 showjancn 的回复:
晕老在这个问题你还没解决?? 
做个标记明天给你个点代码。


是不是忘了啊,代码呢?问题还没有解决
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,