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

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捕捉到“函数不正确”

    评论

报告相同问题?

悬赏问题

  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥85 maple软件,solve求反函数,出现rootof怎么办?
  • ¥15 求chat4.0解答一道线性规划题,用lingo编程运行,第一问要求写出数学模型和lingo语言编程模型,第二问第三问解答就行,我的ddl要到了谁来求了
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题