-------通過USB將硬件連接PC, 更新USB驅動,使用下面方法可控制相關設備。
//1聲明一個串口對象 public static SerialPort MainModule_Port_ = new SerialPort(); //2給串口設置參數 CreateSerialPort(MainNode.MainModule_Port_, comboBox2.Text.Trim(), "9600", "2"); //3設置參數方法 /// <summary> /// 公共創建串口 /// </summary> /// <param name="SP">串口對象</param> /// <param name="SerialPortName">串口名</param> /// <param name="BaudRate">波特率</param> /// <param name="Parity">校驗位</param> public void CreateSerialPort(SerialPort SP, string SerialPortName, string BaudRate, string Parity) { try { //串口屬性類 //SerialPortParamter app = new SerialPortParamter(); SP.PortName = SerialPortName;//串口號 SP.BaudRate = Convert.ToInt32(BaudRate);//波特率 SP.Parity = StringToParity(Parity);//校驗位 SP.DataBits = 8;//數據位 SP.StopBits = StringToStopBits("1");//解析停止位 //SP = app.setParatemer(); SP.DtrEnable = true; SP.RtsEnable = true; } catch (Exception ex) { MessageBox.Show("創建串口失敗!" + SerialPortName); } } //3.1串口屬性校驗位 public static System.IO.Ports.Parity StringToParity(string parity) { if (string.IsNullOrEmpty(parity)) { return System.IO.Ports.Parity.None; } return (System.IO.Ports.Parity)Enum.Parse(typeof(System.IO.Ports.Parity), parity); } //3.2串口屬性停止位 public static System.IO.Ports.StopBits StringToStopBits(string stopBits) { if (string.IsNullOrEmpty(stopBits)) { return System.IO.Ports.StopBits.None; } return (System.IO.Ports.StopBits)Enum.Parse(typeof(System.IO.Ports.StopBits), stopBits); } //////////目前已經創建好了一個串口,下面用來發送指令,下面為16進制的645協議 string mess="68 19 00 00 19 67 37 68 91 08 33 33 34 33 33 35 34 35 d7 16"; byte[] messArray=StrSplitToByte(mess); MainNode.MainModule_Port_.Write(messArray, 0, messArray.Length);//從串口發送協議,正常會將發送或收到幀保持到一個集合,供展示 ///字符串 轉 byte 數組 public static byte[] StrSplitToByte(string inSplitString) { string[] byteStrings; byteStrings = inSplitString.Split(" ".ToCharArray()); byte[] byteOut; byteOut = new byte[byteStrings.Length]; for (int i = 0; i < byteStrings.Length; i++) { if (string.IsNullOrEmpty(byteStrings[i])) { continue; } byteOut[i] = Convert.ToByte(byteStrings[i], 16); } return byteOut; } //////////////發送了協議 ,我們希望得到回復,下面為如何接收協議 //接收幀方法,1376.2協議測試 private void __RecvThread_Agreement_13762() { while (1 == 1) { try { if (MainNode.MainModule_Port_.IsOpen) { int iReadSize = MainNode.MainModule_Port_.BytesToRead; if (iReadSize == 0) { Thread.Sleep(10); continue; } byte[] readBuffer = new byte[iReadSize]; MainNode.MainModule_Port_.Read(readBuffer, 0, iReadSize); //該方法是將接收的幀,在方法中根據幀格式進行判斷,正確后放入同發送一起的集合中。 ProcessRecvData(readBuffer);//處理接收數據 } } catch (Exception e) { ;} } } ///////////////////////////////下面是算幀的校驗位的方法 /// <summary> /// 更新校驗碼645 /// 參數無需" "分隔 /// </summary> public static string UpdateCS645(string baowen) { baowen = baowen.Trim(); string[] mess = null;// AnalysisMessage.separate(baowen, 2).Split(' '); if (baowen.Trim().IndexOf(' ') == -1) { mess = AnalysisMessage.separate(baowen, 2).Split(' '); } else { mess = baowen.Split(' '); } int cs = 0; for (int i = 0; i < mess.Length; i++) { cs += Convert.ToInt32((HexConvert.BCDstrToBin(mess[i])), 2); } string csV = HexConvert.Mess10to16((cs % 256).ToString()); if (csV.Length == 2) return csV; else if (csV.Length == 4) return csV.Substring(2, 2); return csV.Substring(1, 2); } /// <summary> /// 更新校驗碼1376.2 /// </summary> public static int UpdateCS(byte[] bs) { int cs = 0; for (int i = 3; i < bs.Length - 2; i++) { cs += bs[i]; } return cs; }