hanshierlou 2017-04-21 01:49 采纳率: 0%
浏览 1872
已结题

C#串口接收有时候会捕捉到“函数不正确”错误

    /// <summary>
    /// 發送一條16進制指令到繼電器
    /// </summary>
    private void SendDataToJiDianQi(string strSend)
    {
        try
        {
            string[] strArray = strSend.Split(' '); //01 02 00 00 00 09 B8 0C
            byte[] byteBuffer = new byte[strArray.Length];
            int count = 0;
            for (int i = 0; i < strArray.Length; i++)        //对获取的字符做相加运算
            {
                byte[] bytesOfStr = Encoding.Default.GetBytes(strArray[i]);
                int decNum = Convert.ToInt32(strArray[i], 16);
                byteBuffer[count] = Convert.ToByte(decNum);
                count++;
            }
            if (_spJiDianQi.IsOpen)
            {
                _spJiDianQi.DiscardInBuffer();
                _spJiDianQi.DiscardOutBuffer();//当你的程序在窗口发送一帧数据(所谓一帧是指由多个字节组成的有逻辑意义的数据)过程中检测到串口发送错误,如果让串口继续发生就没有意义了,这个时候可以用SerialPort.DiscardOutBuffer方法来清除已经进入发送缓冲区的错误数据;
                _spJiDianQi.Write(byteBuffer, 0, byteBuffer.Length);
            }
            else
            {
                WriteLog("繼電器串口打開失敗!");
            }
        }
        catch (Exception ex)
        {              
            WriteLog("發送指令給繼電器異常:" + ex.Message);
            if (_spJiDianQi.IsOpen)
            {
                _spJiDianQi.DiscardOutBuffer();
            }
        }
    }

    /// <summary>
    /// 接收繼電器串口數據的方法
    /// </summary>
    private string ReceiveDataFromJiDianQi()
    {
        string value = "";
        try
        {
            if (_spJiDianQi.IsOpen)
            {

                Thread.Sleep(50); //為了接收數據的完整性
                int byteNum = _spJiDianQi.BytesToRead;
                if (byteNum > 0)
                {
                    byte[] receivedData = new byte[byteNum];        //创建接收字节数组
                    if (receivedData.Length > 0)
                    {
                        _spJiDianQi.Read(receivedData, 0, receivedData.Length);         //读取数据
                        for (int i = 0; i < receivedData.Length; i++)
                        {
                            value += receivedData[i].ToString("X2");  //16进制显示
                        }

                        //_spJiDianQi.DiscardInBuffer();//当你的程序在接收一帧数据时发生错误,如果再让串口继续接收也没有意义了,这个时候可以用SerialPort.DiscardInBuffer方法来清除已经进入接收缓冲区的错误数据了
                    }
                    else
                    {
                        WriteLog("讀取繼電器串口數據時,沒有數據返回。");
                    }
                }
            }
            else
            {
                WriteLog("繼電器串口打開失敗!");
            }
        }
        catch (Exception ex)
        {
            WriteLog("讀取繼電器串口數據方法異常:" + ex.Message);
            //if (_spJiDianQi.IsOpen)
            //{
            //    _spJiDianQi.DiscardInBuffer();
            //}
        }
        return value;
    }
  • 写回答

2条回答 默认 最新

  • hanshierlou 2017-04-21 01:58
    关注

    这个ReceiveDataFromJiDianQi()方法有时候会偶尔try catch捕捉到“函数不正确”

    评论

报告相同问题?

悬赏问题

  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!