/// <summary> /// 发送握手指令 /// </summary> public int SendShakehand(uint deviceId) { CAN_MSG_T msg = new CAN_MSG_T(); msg.rtr = 0; msg.dlen = 2; msg.id = deviceId; msg.data = new byte[8]; msg.data[0] = (byte)(0x10 + deviceId & 0x0F); msg.data[1] = InstructNum; return(CanBusApi.CANWriteFile(m_nPort, ref ready, ref msg)); }
/// <summary> /// 开启监听Can总线的线程 /// </summary> public void BeginListen() { ThreadPool.QueueUserWorkItem(o => { CAN_MSG_T cMsg = new CAN_MSG_T(); cMsg.data = new byte[8]; int returnNum = 0; CanBusApi.CANReadFile(m_nPort, 1, ref cMsg, ref returnNum); if (returnNum > 0) { receiveData[(cMsg.data[0] >> 4) - 1].Enqueue(cMsg); } }); }
/// <summary> /// Can通讯初始化 /// </summary> public void CanInit(IntPtr hwnd) { m_nBTR0 = 0x03; m_nBTR1 = 0x1C; m_nAcpCode = 0; m_nAcpMask = 255; m_nIntMask = 0; m_nOutCtrlCode = 250; byte[] DeviceName = Encoding.ASCII.GetBytes(m_strDevName); CanBusApi.CANPortClose(m_nPort); if (CanBusApi.CANSelectDevice(hwnd, 0, ref m_nDevNum, DeviceName) != 0) { } if (CanBusApi.CANPortOpen((UInt16)m_nDevNum, ref m_nPort, ref m_nHostID, ref m_nPreBaudRate) != 0) { MessageBox.Show("CAN port open error!", "Error"); } if (CanBusApi.CANSetProtocolType(m_nPort, 0) != 0) { MessageBox.Show("CAN Set Protocol Type error!", "Error"); CanBusApi.CANPortClose(m_nPort); } if (CanBusApi.CANHwReset(m_nPort) != 0) { MessageBox.Show("CAN port HW Reset error!", "Error"); CanBusApi.CANPortClose(m_nPort); } if (CanBusApi.CANInit(m_nPort, m_nBTR0, m_nBTR1, (byte)m_nIntMask) != 0) { MessageBox.Show("CAN port init error!", "Error"); CanBusApi.CANPortClose(m_nPort); } if (CanBusApi.CANSetOutCtrl(m_nPort, m_nOutCtrlCode) != 0) { MessageBox.Show("CAN set out ctrl code error!", "Error"); CanBusApi.CANPortClose(m_nPort); } if (CanBusApi.CANSetAcp(m_nPort, m_nAcpCode, m_nAcpMask) != 0) { MessageBox.Show("CAN set acp code error!", "Error"); CanBusApi.CANPortClose(m_nPort); } if (CanBusApi.CANSetBaud(m_nPort, m_nBTR0, m_nBTR1) != 0) { MessageBox.Show("CAN set baud rate error!", "Error"); CanBusApi.CANPortClose(m_nPort); } if (CanBusApi.CANSetNormal(m_nPort) != 0) { MessageBox.Show("CAN set normal error!", "Error"); CanBusApi.CANPortClose(m_nPort); } CanBusApi.CANEnableEvent(m_nPort, 1); CanBusApi.CANEnableRxInt(m_nPort); m_strDevName = Encoding.ASCII.GetString(DeviceName); }