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; } }
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; }
/// <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); } } }