一, 可能需要的软件:
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();
- }
来源: https://www.cnblogs.com/sdxlz666/p/10577169.html