using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO.Ports; using System.Threading; using System.Windows.Forms; namespace demo.ClassHelper.SerialPortOperate { public delegate void EventHandler_Comm(byte[] readBuffer); class SerialPortHelper { public event EventHandler_Comm DataReceived; public SerialPort serialPort; Thread thread; volatile bool _keepReading; public SerialPortHelper() { serialPort = new SerialPort(); thread = null; _keepReading = false; } public bool IsOpen { get { return serialPort.IsOpen; } } private void StartReading() { if (!_keepReading) { _keepReading = true; thread = new Thread(new ThreadStart(ReadPort)); thread.Start(); } } private void StopReading() { _keepReading = false; if (!_keepReading) { _keepReading = false; //thread.Join(); thread = null; } } private void ReadPort() { while (_keepReading) { if (serialPort.IsOpen) { int count=-1; Thread.Sleep(30); try { count = serialPort.BytesToRead; } catch {} if (count > 0) { byte[] readBuffer = new byte[count]; try { Application.DoEvents(); serialPort.Read(readBuffer, 0, count); if (DataReceived != null) { DataReceived(readBuffer); } Thread.Sleep(50); } catch { } } } } } public bool Open() { bool ret = true; try { //Close(); serialPort.Open(); } catch { return false; } if (serialPort.IsOpen) { StartReading(); } else { ret = false;//MessageBox.Show("串口打开失败!"); } return ret; } public void Close() { StopReading(); serialPort.Close(); } public void WritePort(byte[] send, int offSet, int count) { if (IsOpen) { serialPort.Write(send, offSet, count); } } public void WriteFile(string txt) { if (IsOpen) { serialPort.WriteLine(txt); } } #region ////字符长度的理解 // string s = "我是一个2兵"; // int len = s.Length;//6个字符 // byte[] sarr = System.Text.Encoding.Default.GetBytes(s); // len = sarr.Length;//11个字节 // //10进制转字符串,也没有意义,要转成对应的ascii码 // int t1 = 81; // string s1 = t1.ToString(); // //这个10进制转对应ASCII字符才有意义。 // s1 = ((char)t1).ToString(); // //16进制转字符串:这个没有意义。就是tostring了。 // int intAB = 0x16; // s1 = intAB.ToString(); // //16进制转对应ASCII字符: // byte babb = 0x45; // string ass = ((char)babb).ToString(); // //ASCII字符串转10进制数 // string tr = "2Ab刘"; // string d =""; // for (int i = 0; i < tr.Length; i++) // { // int ii = (int)Convert.ToChar(tr.Substring(i, 1)); // d = d +" "+ ii.ToString(); // } // //ASCII字符串转16进制数 // string s2 = "2Ab刘"; // byte[] ba = System.Text.ASCIIEncoding.Default.GetBytes(s2); // StringBuilder sb = new StringBuilder(); // foreach (byte b in ba) // { // sb.Append(b.ToString("x") + " "); // } // //16进制数转10进制 // int intA = 0x16;//定义的时候是必须带0x的 // string strA = "16";//字符串可以不带 // int intA1 = Convert.ToInt32(intA); // int intA2 = Convert.ToInt32(strA, 16); // //10进制转16进制 // strA = Convert.ToString(intA2, 16); // //10进制转2进制,16进制类似 // int int10 = 10; // string str2 = Convert.ToString(int10,2); // //2进制转10进制 // int10 = Convert.ToInt32(str2,2); #endregion } }