主窗体:

  public SerialPortClient portClient = new SerialPortClient();private void FrmMain_Load(object sender, EventArgs e){InitCmb();InitPort();}private void InitCmb(){// 绑定端口号portClient.PortName = Port;//波特率portClient.BaudRate = (BaudRates)Enum.Parse(typeof(BaudRates), BaudRate);//数据位portClient.DataBits = (DataBits)Enum.Parse(typeof(DataBits), DataBits);//校验位portClient.Parity = (Parity)Enum.Parse(typeof(Parity), Parity1 == "奇校验" ? "1" : Parity1 == "偶校验" ? "2" : "0");//停止位portClient.StopBits = (StopBits)Enum.Parse(typeof(StopBits), StopBit);}private void InitPort(){portClient.DataReceived += new Action<List<byte>>(datapool =>{while (true){if (datapool.Count < 4) break;if ((datapool[0] == 0x7B)){datapool.RemoveAt(0);continue;}int index = -1;//正确作法是记住上次最末尾的索引,避免重复匹配for (int i = 0; i < datapool.Count - 1; i++){if (datapool[i] == 0x7D){index = i;break;}}if (index != -1){try{byte[] data = datapool.GetRange(0, index).ToArray();datapool.RemoveRange(0, index + 2);string msg = Encoding.UTF8.GetString(data, 0, data.Length);}catch (Exception ex){}}else break;}});}private void button1_Click(object sender, EventArgs e){logicForDD.portClient.Open();}private void button2_Click(object sender, EventArgs e){logicForDD.portClient.Close();}

SerialPortClient类:

    public class SerialPortClient{#region 静态方法/// <summary>/// 设置串口号/// </summary>/// <param name="obj">需要绑定的项的集合(如:ComboBox中项的集合ComboBox.Items)</param>public static void SetPortNameValues(IList obj){obj.Clear();try{foreach (string str in SerialPort.GetPortNames()){obj.Add(str);}}catch (Exception e){Console.WriteLine("未能查询到串口名称——" + e.ToString());}}/// <summary>/// 设置波特率/// </summary>/// <param name="obj">需要绑定的项的集合(如:ComboBox中项的集合ComboBox.Items)</param>public static void SetBauRateValues(IList obj){obj.Clear();foreach (BaudRates rate in Enum.GetValues(typeof(BaudRates))){obj.Add(((int)rate).ToString());}}/// <summary>/// 设置数据位/// </summary>/// <param name="obj">需要绑定的项的集合(如:ComboBox中项的集合ComboBox.Items)</param>public static void SetDataBitsValues(IList obj){obj.Clear();foreach (DataBits databit in Enum.GetValues(typeof(DataBits))){obj.Add(((int)databit).ToString());}}/// <summary>/// 设置校验位列表/// </summary>/// <param name="obj">需要绑定的项的集合(如:ComboBox中项的集合ComboBox.Items)</param>public static void SetParityValues(IList obj){obj.Clear();foreach (string str in Enum.GetNames(typeof(Parity))){obj.Add(str);}}/// <summary>/// 设置停止位/// </summary>/// <param name="obj">需要绑定的项的集合(如:ComboBox中项的集合ComboBox.Items)</param>public static void SetStopBitValues(IList obj){obj.Clear();foreach (string str in Enum.GetNames(typeof(StopBits))){obj.Add(str);}}#endregion#region 变量属性public event Action<List<byte>> DataReceived;public event SerialErrorReceivedEventHandler ErrorReceived;private SerialPort comPort = new SerialPort();private string portName = "COM1";//串口号,默认COM1private BaudRates baudRate = BaudRates.BR_9600;//波特率private Parity parity = Parity.None;//校验位private StopBits stopBits = StopBits.One;//停止位private DataBits dataBits = DataBits.Eight;//数据位        /// <summary>/// 串口号/// </summary>public string PortName{get { return portName; }set { portName = value; }}/// <summary>/// 波特率/// </summary>public BaudRates BaudRate{get { return baudRate; }set { baudRate = value; }}/// <summary>/// 奇偶校验位/// </summary>public Parity Parity{get { return parity; }set { parity = value; }}/// <summary>/// 数据位/// </summary>public DataBits DataBits{get { return dataBits; }set { dataBits = value; }}/// <summary>/// 停止位/// </summary>public StopBits StopBits{get { return stopBits; }set { stopBits = value; }}#endregion#region 构造函数/// <summary>/// 无参构造函数/// </summary>public SerialPortClient(){BoundEvents();}void BoundEvents(){comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);comPort.ErrorReceived += new SerialErrorReceivedEventHandler(comPort_ErrorReceived);}/// <summary>/// 参数构造函数(使用枚举参数构造)/// </summary>/// <param name="baud">波特率</param>/// <param name="par">奇偶校验位</param>/// <param name="sBits">停止位</param>/// <param name="dBits">数据位</param>/// <param name="name">串口号</param>public SerialPortClient(string name, BaudRates baud, Parity par, DataBits dBits, StopBits sBits){this.portName = name;this.baudRate = baud;this.parity = par;this.dataBits = dBits;this.stopBits = sBits;BoundEvents();}/// <summary>/// 参数构造函数(使用字符串参数构造)/// </summary>/// <param name="baud">波特率</param>/// <param name="par">奇偶校验位</param>/// <param name="sBits">停止位</param>/// <param name="dBits">数据位</param>/// <param name="name">串口号</param>public SerialPortClient(string name, string baud, string par, string dBits, string sBits){this.portName = name;this.baudRate = (BaudRates)Enum.Parse(typeof(BaudRates), baud);this.parity = (Parity)Enum.Parse(typeof(Parity), par);this.dataBits = (DataBits)Enum.Parse(typeof(DataBits), dBits);this.stopBits = (StopBits)Enum.Parse(typeof(StopBits), sBits);BoundEvents();}#endregion#region 事件处理函数/// <summary>/// 数据仓库/// </summary>List<byte> datapool = new List<byte>();//存放接收的所有字节/// <summary>/// 数据接收处理/// </summary>void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e){if (comPort.IsOpen)     //判断是否打开串口{Byte[] receivedData = new Byte[comPort.BytesToRead];        //创建接收字节数组comPort.Read(receivedData, 0, receivedData.Length);         //读取数据//触发整条记录的处理if (DataReceived != null){datapool.AddRange(receivedData);DataReceived(datapool);}}else{Console.WriteLine("请打开某个串口", "Error");}}/// <summary>/// 错误处理函数/// </summary>void comPort_ErrorReceived(object sender, SerialErrorReceivedEventArgs e){if (ErrorReceived != null){ErrorReceived(sender, e);}}#endregion#region 串口关闭/打开/// <summary>/// 端口是否已经打开/// </summary>public bool IsOpen{get{return comPort.IsOpen;}}/// <summary>/// 打开端口/// </summary>/// <returns></returns>public void Open(){if (comPort.IsOpen) comPort.Close();comPort.PortName = portName;comPort.BaudRate = (int)baudRate;comPort.Parity = parity;comPort.DataBits = (int)dataBits;comPort.StopBits = stopBits;comPort.Open();}/// <summary>/// 关闭端口/// </summary>public void Close(){if (comPort.IsOpen) comPort.Close();}/// <summary>/// 丢弃来自串行驱动程序的接收和发送缓冲区的数据/// </summary>public void DiscardBuffer(){comPort.DiscardInBuffer();comPort.DiscardOutBuffer();}#endregion#region 写入数据/// <summary>/// 写入数据/// </summary>/// <param name="buffer"></param>public void Write(byte[] buffer, int offset, int count){if (!(comPort.IsOpen)) comPort.Open();comPort.Write(buffer, offset, count);}/// <summary>/// 写入数据/// </summary>/// <param name="buffer">写入端口的字节数组</param>public void Write(byte[] buffer){if (!(comPort.IsOpen)) comPort.Open();comPort.Write(buffer, 0, buffer.Length);}#endregion}#region 波特率、数据位的枚举/// <summary>/// 串口数据位列表(5,6,7,8)/// </summary>public enum DataBits : int{Five = 5,Six = 6,Sevent = 7,Eight = 8}/// <summary>/// 串口波特率列表。/// 75,110,150,300,600,1200,2400,4800,9600,14400,19200,28800,38400,56000,57600,/// 115200,128000,230400,256000/// </summary>public enum BaudRates : int{BR_75 = 75,BR_110 = 110,BR_150 = 150,BR_300 = 300,BR_600 = 600,BR_1200 = 1200,BR_2400 = 2400,BR_4800 = 4800,BR_9600 = 9600,BR_14400 = 14400,BR_19200 = 19200,BR_28800 = 28800,BR_38400 = 38400,BR_56000 = 56000,BR_57600 = 57600,BR_115200 = 115200,BR_128000 = 128000,BR_230400 = 230400,BR_256000 = 256000}#endregion

C# winfrom 串口连接处理数据相关推荐

  1. 51单片机连接维特智能JY61串口6轴加速度陀螺仪(通过串口中断实现数据的现实)

    51单片机连接维特智能JY61串口6轴加速度陀螺仪(通过串口中断实现数据的现实) 1.JY61的初始化 利用USB转TTL模块连接只需要连接: 打开厂家赠送的上位机软件,模块出厂默认设置使用串口,波特 ...

  2. NBIOT专栏之BC28串口连接阿里云物联网平台接发数据

    NBIOT专栏系列目录 创思通信BC28核心板+STM32F系列单片机开发记录博客 BC28核心板资料包下载: https://pan.baidu.com/s/1Du7EXgMRAmbFupT_VUY ...

  3. javarxtx串口接收时数据会分成好几段_【STM32】串口通信基本原理(超基础、详细版)...

    STM32F1xx官方资料: <STM32中文参考手册V10>-第25章通用同步异步收发器(USART) 通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通 ...

  4. C语言怎么读取串口的数据为,如何通过串口来读写数据,请教达人

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 如何通过终端读取并显示串口连接的某硬件的数据 通过一程序来代替hexdump  从而进行输入输出 用C语言实现 下面一程序为i/o输入输出,请教达人,怎样 ...

  5. 【嵌入式开发】嵌入式 开发环境 (远程登录 | 文件共享 | NFS TFTP 服务器 | 串口连接 | Win8.1 + RedHat Enterprise 6.3 + Vmware11)

    作者 : 万境绝尘 博客地址 : http://blog.csdn.net/shulianghan/article/details/42254237 一. 相关工具下载 嵌入式开发工具包 : -- 下 ...

  6. c语言从串口获取数据,如何通过串口来读写数据,请教达人

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 如何通过终端读取并显示串口连接的某硬件的数据 通过一程序来代替hexdump  从而进行输入输出 用C语言实现 下面一程序为i/o输入输出,请教达人,怎样 ...

  7. c语言如何获取串口列表,如何通过串口来读写数据,请教达人

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 如何通过终端读取并显示串口连接的某硬件的数据 通过一程序来代替hexdump  从而进行输入输出 用C语言实现 下面一程序为i/o输入输出,请教达人,怎样 ...

  8. 学习 STM32之九轴姿态传感器(BWT901CL)串口通信读取数据

    由于个人应用到3轴传感器,所以买了直接买了一个9轴的,用于学习STM32Core平台串口2连接维特智能串口Normal协议,然后通过串口1直接打印数据,接收传感器数据和与传感器进行通信:需要看产品文档 ...

  9. S3C2440 GPS串口配置以及数据读写

    S3C2440 GPS串口配置以及数据读写 参考文章:http://www.cnblogs.com/jason-lu/articles/3173988.html       http://www.cn ...

最新文章

  1. Numpy入门教程:07. 随机抽样
  2. 为tomcat6批量生成安全证书
  3. MQ日常维护操作手册
  4. html社交模板,Olympus – 社交网HTML静态模板
  5. word2vec, LSTM Speech Recognition实战, 图数据库
  6. Nginx调度器(反向代理)
  7. 服务器物理部署拓扑图,【网络】叶脊(Spine-Leaf)网络拓扑下全三层网络设计与实践(五)-物理服务器路由方案及配置...
  8. 关于T4,正在发生的...
  9. 活动服务器优化 暂时关闭,服务器优化之关闭不必要的服务
  10. MATLAB中if (0)
  11. 怎样使用计算机定时关机,如何设置电脑每天定时关机?电脑设置定时关机的方法...
  12. 43款设计师必备英文设计字体【书法类字体】
  13. 人工智能和5G在无人机技术中的作用
  14. win7加速优化技巧
  15. 进阶的阿牛哥之如何存储每日数据到csv或txt文件(如何实现换行)
  16. c++用贪心算法解决汽车加油问题
  17. C语言中的strcat()函数
  18. 数据挖掘基础:独立性检验
  19. 电磁离合器线圈绕线机
  20. 机器学习-了解逻辑回归的逻辑过程

热门文章

  1. 小福利,django搭建个人网站的源码公开(一)
  2. goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题。recover panic 协程的错误处理
  3. [mysql]数据库/表的DDL、DML基本语法参考
  4. html2canvas 一个强大的使用js开发的浏览器网页截图工具
  5. 阿里云七夕密码情书免费领取Git命令超大鼠标垫(附答案)
  6. bim 导入unity_一种基于BIM和Unity3d的3D物联网可视化人机交互方法与流程
  7. 如何查看linux的触摸板驱动是哪个?
  8. Portrait Professional 10.9.5汉化破解版(支持CC)
  9. ElasticSerach6.0.1测试拼音分词器,IK分词器,并且次测试语法
  10. win7无线网卡策略服务器,老鸟教你win7无线网卡不见了的完全处理手段