Ejemplo n.º 1
0
        public void ConnectStateCallback(MCUConnectState state)
        {
            Debug.Log("state = " + state);
            if (state == MCUConnectState.connect)
            {
                KeyFlag.color = new Color(0.0f, 1.0f, 0.0f);

                button0.enabled = true;
                button1.enabled = true;
            }
            else
            {
                KeyFlag.color = new Color(0.0f, 0.0f, 0.0f);

                button0.enabled = false;
                button1.enabled = false;
            }
        }
Ejemplo n.º 2
0
 private void ResetState()
 {
     lock (_lockObject)
     {
         if (_serialPort != null)
         {
             _serialPort.Close();
         }
     }
     //JW.Common.Log.LogE("关闭串口:" + _portNames[_checkCount]);
     _checkCount++;
     if (_checkCount == _portNames.Length)
     {
         _checkCount = 0;
         //得到的串口都检查一遍了,没有发现下位机,就重新获取串口列表重试
         _state = 0;
     }
     else
     {
         //还有没有把所有的串口都尝试一遍,所以尝试下一个了哦
         _state = 1;
     }
     _connectState = MCUConnectState.disconnect;
 }
Ejemplo n.º 3
0
        /// <summary>
        /// 工作线程
        /// </summary>
        private void WorkThreadProcess()
        {
            while (true)
            {
                //状态0表示在搜索串口
                if (_state == 0)
                {
                    lock (_lockObject)
                    {
                        _portNames = SerialPort.GetPortNames();
                    }
                    if (_portNames == null || _portNames.Length == 0)
                    {
                        //JW.Common.Log.LogE("没有串口 等待重新检查");
                        _state = 0;
                        Thread.Sleep(5000);
                    }
                    else
                    {
                        JW.Common.Log.LogD("全部串口如下:");
                        foreach (var name in _portNames)
                        {
                            JW.Common.Log.LogD(name);
                        }
                        _state = 1;
                        Thread.Sleep(5);
                    }
                }

                //打开不同的串口
                if (_state == 1)
                {
                    try
                    {
                        string realName = string.Empty;
                        lock (_lockObject)
                        {
                            int index = _portNames[_checkCount].IndexOf("M");
                            int A     = int.Parse(_portNames[_checkCount].Substring(index + 1));
                            if (A < 9)
                            {
                                realName    = _portNames[_checkCount];
                                _serialPort = new SerialPort(_portNames[_checkCount], 19200, Parity.None, 8, StopBits.One);
                            }
                            else
                            {
                                realName    = "\\\\.\\" + _portNames[_checkCount];
                                _serialPort = new SerialPort("\\\\.\\" + _portNames[_checkCount], 19200, Parity.None, 8, StopBits.One);
                            }

                            _serialPort.Open();
                            //下位机会10ms发送一次信息,这里设置40ms,是发送间隔的3+倍,只要下位机正常,肯定能收到完成的一帧。至于什么,自己根据采样定律想去!
                            _serialPort.ReadTimeout = 40;
                        }
                        //开始读取
                        _state           = 2;
                        _frameState      = 0;
                        _frameDataCount  = 0;
                        _contentErrorNum = 0;
                        JW.Common.Log.LogD("打开串口成功:" + realName);
                    }
                    catch (IOException exp)
                    {
                        //JW.Common.Log.LogE("打开串口:" + _portNames[_checkCount] + "失败:" + exp.Message);
                        _checkCount++;
                        if (_checkCount == _portNames.Length)
                        {
                            //得到的串口都检查一遍了,没有发现下位机,就重新获取串口列表重试
                            _checkCount = 0;
                            _state      = 0;
                            //JW.Common.Log.LogE("没找到串口 等待重试!");
                        }
                        _serialPort = null;
                    }

                    Thread.Sleep(5);
                }
                //读取串口数据
                if (_state == 2)
                {
                    try
                    {
                        int realReadNum;
                        lock (_lockObject)
                        {
                            realReadNum = _serialPort.Read(_readBytes, 0, 100);
                        }
                        for (int i = 0; i < realReadNum; i++)
                        {
                            switch (_frameState)
                            {
                            case 0:
                                if (_readBytes[i] == 0x55)
                                {
                                    //有帧头了,就到接收其他的
                                    _frameState     = 1;
                                    _frameDataCount = 0;
                                }
                                else
                                {
                                    _contentErrorNum++;
                                }
                                break;

                            case 1:
                                _frameBytes[_frameDataCount++] = _readBytes[i];
                                if (_frameDataCount == 8)
                                {
                                    if (_frameBytes[0] == _frameBytes[4] && _frameBytes[1] == _frameBytes[5] && _frameBytes[2] == _frameBytes[6])
                                    {
                                        _frameState = 2;
                                    }
                                    else
                                    {
                                        _frameState = 0;
                                        _contentErrorNum++;
                                    }
                                }
                                break;

                            case 2:
                                if (_readBytes[i] == 0xcc)
                                {
                                    uint keyStateL = _frameBytes[0];
                                    uint keyStateH = _frameBytes[1];
                                    _keyState = keyStateL | (keyStateH << 8);

                                    int tmpRotationCount = BitConverter.ToInt16(_frameBytes, 2);
                                    //这是原子操作哦
                                    Interlocked.Add(ref _rotationCount, tmpRotationCount);

                                    _frameState      = 0;
                                    _contentErrorNum = 0;

                                    //连接了
                                    _connectState = MCUConnectState.connect;
                                }
                                else
                                {
                                    _contentErrorNum++;
                                }
                                break;

                            default: break;
                            }

                            if (_contentErrorNum > 3)
                            {
                                //JW.Common.Log.LogE("McuInput 接收内容错误");
                                ResetState();
                            }
                        }
                    }
                    catch (TimeoutException)
                    {
                        //JW.Common.Log.LogE("McuInput 接收时间超时");
                        ResetState();
                    }
                    Thread.Sleep(5);
                }
            }
        }