VS编程,C#串口通讯,通过串口读取数据的一种方法
一、可能需要的软件:
1、虚拟串口vspd(Virtual Serial Port Driver,用来在电脑上虚拟出一对串口,模拟通讯。
2、友善串口调试助手,用来发送、读取数据。
二、思路
1、查询本机所有的串口
2、判断需要的串口是否存在本机的串口中
3、设置串口的参数,如波特率、奇偶校验等。
4、打开串口,
5、通过串口读取数据,处理数据
6、关闭当前窗口时,将串口一并关闭。
7、可以写一个定时器,来循环执行1、2两步,并判断串口是否打开,以保持串口通讯正常。
三,代码
1、查询本机所有的串口
/// <summary> /// 获取本机串口列表 /// </summary> /// <param name="isUseReg"></param> /// <returns></returns> private List<string> GetComlist(bool isUseReg) { List<string> list = new List<string>(); try { if (isUseReg) { RegistryKey RootKey = Registry.LocalMachine; RegistryKey Comkey = RootKey.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM"); String[] ComNames = Comkey.GetValueNames(); foreach (String ComNamekey in ComNames) { string TemS = Comkey.GetValue(ComNamekey).ToString(); list.Add(TemS); } } else { foreach (string com in SerialPort.GetPortNames()) //自动获取串行口名称 list.Add(com); } } catch { MessageBox.Show("串行端口检查异常!", "提示信息"); // System.Environment.Exit(0); //彻底退出应用程序 } return list; }
2、判断需要的串口是否存在本机的串口中
/// <summary> /// 判断是否存在当前串口 /// </summary> private void StartSerialPortMonitor() { List<string> comList = GetComlist(false); //首先获取本机关联的串行端口列表 if (comList.Count == 0) { MessageBox.Show("当前设备不存在串行端口!", "提示信息"); // System.Environment.Exit(0); //彻底退出应用程序 } else { string targetCOMPort = "COM8"; //判断串口列表中是否存在目标串行端口 if (!comList.Contains(targetCOMPort)) { MessageBox.Show("提示信息", "当前设备不存在配置的串行端口!"); //System.Environment.Exit(0); //彻底退出应用程序 } } }
3、设置串口的参数,如波特率、奇偶校验等。
首先定义字段:
private SerialPort serialPort;
/// <summary> /// 设置通讯串口 /// </summary> public void setcom() { try { StartSerialPortMonitor(); serialPort.PortName = "COM8"; //通信端口 serialPort.BaudRate = 9600; //串行波特率 serialPort.DataBits = 8; //每个字节的标准数据位长度 serialPort.StopBits = StopBits.Two; //设置每个字节的标准停止位数 serialPort.Parity = Parity.None; //设置奇偶校验检查协议 //下面这句是当信息中有汉字时,能正确传输,不然会出现问号。 serialPort.Encoding = System.Text.Encoding.GetEncoding("GB2312"); //串口控件成员变量,字面意思为接收字节阀值, //串口对象在收到这样长度的数据之后会触发事件处理函数 //一般都设为1 serialPort.ReceivedBytesThreshold = 1; serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //设置数据接收事件(监听) serialPort.Open(); //打开串口 } catch (Exception ex) { MessageBox.Show(ex.Message); } }4、打开串口,
5、通过串口读取数据,处理数据
/// <summary> /// 通讯有数据进执行 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e) { getcom(); }public void getcom() { try { //定义一个字段,来保存串口传来的信息。 string str = ""; int len = serialPort.BytesToRead; Byte[] readBuffer = new Byte[len]; serialPort.Read(readBuffer, 0, len); str = Encoding.Default.GetString(readBuffer); //如果需要和界面上的控件交互显示数据,使用下面的方法。其中ttt是控件的名称。 //this.tttt.Dispatcher.Invoke(new Action(() => //{ // tttt.Text = str ; //})); serialPort.DiscardInBuffer(); //清空接收缓冲区 } catch (Exception ex) { serialPort.Close(); MessageBox.Show(ex.Message); } }6、关闭当前窗口时,将串口一并关闭
private void MainWindow1_Closed(object sender, EventArgs e) { if (serialPort.IsOpen) { serialPort.Close(); } }
7、可以写一个定时器,来循环执行1、2两步,保持串口通讯正常。
如果电脑不存在串口,提示警告 如果目标串口不在电脑的串口列表里,提示警告, 如果目标串口当前是关闭的状态,将其打开。 如果串口已经打开,再次打开会报错,无法正常工作。一定要注意。
if (!serialPort.IsOpen) { serialPort.Open(); }