.net串口通信

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using System.IO.Ports;
 10 using System.Text.RegularExpressions;
 11
 12 namespace SerialportSample
 13 {
 14     public partial class SerialportSampleForm : Form
 15     {
 16         private SerialPort comm = new SerialPort();
 17         private StringBuilder builder = new StringBuilder();//避免在事件处理方法中反复的创建,定义到外面。
 18         private long received_count = 0;//接收计数
 19         private long send_count = 0;//发送计数
 20         private bool listenning = false;//是否没有执行完invoke相关操作
 21         private bool closing = false;//是否正在关闭串口,执行Application.DoEvents,并阻止再次invoke
 22
 23         public SerialportSampleForm()
 24         {
 25             InitializeComponent();
 26         }
 27
 28         //窗体初始化
 29         private void Form1_Load(object sender, EventArgs e)
 30         {
 31             //初始化下拉串口名称列表框
 32             string[] ports = SerialPort.GetPortNames();
 33             Array.Sort(ports);
 34             comboPortName.Items.AddRange(ports);
 35             comboPortName.SelectedIndex = comboPortName.Items.Count > 0 ? 0 : -1;
 36             comboBaudrate.SelectedIndex = comboBaudrate.Items.IndexOf("9600");
 37
 38             //初始化SerialPort对象
 39             comm.NewLine = "\r\n";
 40             comm.RtsEnable = true;//根据实际情况吧。
 41
 42             //添加事件注册
 43             comm.DataReceived += comm_DataReceived;
 44         }
 45
 46         void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
 47         {
 48             int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
 49             byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
 50             received_count += n;//增加接收计数
 51             comm.Read(buf, 0, n);//读取缓冲数据
 52             builder.Clear();//清除字符串构造器的内容
 53             //因为要访问ui资源,所以需要使用invoke方式同步ui。
 54             this.Invoke((EventHandler)(delegate
 55             {
 56                 try
 57                 {
 58                     listenning = true;
 59                     //判断是否是显示为16禁止
 60                     if (checkBoxHexView.Checked)
 61                     {
 62                         //依次的拼接出16进制字符串
 63                         foreach (byte b in buf)
 64                         {
 65                             builder.Append(b.ToString("X2") + " ");
 66                         }
 67                     }
 68                     else
 69                     {
 70                         //直接按ASCII规则转换成字符串
 71                         builder.Append(Encoding.ASCII.GetString(buf));
 72                     }
 73                     //追加的形式添加到文本框末端,并滚动到最后。
 74                     this.txGet.AppendText(builder.ToString());
 75                     //修改接收计数
 76                     labelGetCount.Text = "Get:" + received_count.ToString();
 77                 }
 78                 finally
 79                 {
 80                     listenning = false;
 81
 82                 }
 83             }));
 84         }
 85
 86         private void buttonOpenClose_Click(object sender, EventArgs e)
 87         {
 88             //根据当前串口对象,来判断操作
 89             if (comm.IsOpen)
 90             {
 91                 closing = true;
 92                 while (listenning)//监听时做完ui操作
 93                     Application.DoEvents();
 94                 //打开时点击,则关闭串口
 95                 comm.Close();
 96                 closing = false;
 97             }
 98             else
 99             {
100                 //关闭时点击,则设置好端口,波特率后打开
101                 comm.PortName = comboPortName.Text;
102                 comm.BaudRate = int.Parse(comboBaudrate.Text);
103                 try
104                 {
105                     comm.Open();
106                 }
107                 catch(Exception ex)
108                 {
109                     //捕获到异常信息,创建一个新的comm对象,之前的不能用了。
110                     comm = new SerialPort();
111                     //现实异常信息给客户。
112                     MessageBox.Show(ex.Message);
113                 }
114             }
115             //设置按钮的状态
116             buttonOpenClose.Text = comm.IsOpen ? "Close" : "Open";
117             buttonSend.Enabled = comm.IsOpen;
118         }
119
120         //动态的修改获取文本框是否支持自动换行。
121         private void checkBoxNewlineGet_CheckedChanged(object sender, EventArgs e)
122         {
123             txGet.WordWrap = checkBoxNewlineGet.Checked;
124         }
125
126         private void buttonSend_Click(object sender, EventArgs e)
127         {
128             //定义一个变量,记录发送了几个字节
129             int n = 0;
130             //16进制发送
131             if (checkBoxHexSend.Checked)
132             {
133                 //我们不管规则了。如果写错了一些,我们允许的,只用正则得到有效的十六进制数
134                 MatchCollection mc = Regex.Matches(txSend.Text, @"(?i)[\da-f]{2}");
135                 List<byte> buf = new List<byte>();//填充到这个临时列表中
136                 //依次添加到列表中
137                 foreach (Match m in mc)
138                 {
139                     buf.Add(byte.Parse(m.Value));
140                 }
141                 //转换列表为数组后发送
142                 comm.Write(buf.ToArray(), 0, buf.Count);
143                 //记录发送的字节数
144                 n = buf.Count;
145             }
146             else//ascii编码直接发送
147             {
148                 //包含换行符
149                 if (checkBoxNewlineSend.Checked)
150                 {
151                     comm.WriteLine(txSend.Text);
152                     n = txSend.Text.Length + 2;
153                 }
154                 else//不包含换行符
155                 {
156                     comm.Write(txSend.Text);
157                     n = txSend.Text.Length;
158                 }
159             }
160             send_count += n;//累加发送字节数
161             labelSendCount.Text = "Send:" + send_count.ToString();//更新界面
162         }
163
164         private void buttonReset_Click(object sender, EventArgs e)
165         {
166             //复位接受和发送的字节数计数器并更新界面。
167             send_count = received_count = 0;
168             labelGetCount.Text = "Get:0";
169             labelSendCount.Text = "Send:0";
170         }
171     }
172 }

这里的listening的细节可以避免串口关闭的锁死的情况

时间: 2024-10-16 15:36:44

.net串口通信的相关文章

51单片机之串口通信(三)

51单片机之串口通信(三) 已有 47 次阅读2015-12-29 00:21 |个人分类:51单片机| 单片机, 通信 用串口实现发送和接收同时可操作: 电脑显示结果如图: 源程序: /*项目名称:串口发送接收实验项目内容:串口发送接收同时进行,计算机发送数据给单片机控制P0口,从而控制LED灯的亮灭,单片机发送数据到计算机,计算机显示出来时间:2015年12月23日项目负责人:YUAN*/#include <reg52.h>typedef unsigned char uChar8;type

(转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信

此文章以visual C++数据採集与串口通信測控应用实战为參考教程 此文章适合VC++串口通信入门 一.页面布局及加入控件 1, 安装好vs2010如图 2, 新建一个基于VC++的MFC项目comm 注意:点击ok,然后next,这时候要将application type改成dialog base.接着next到最后一个对话框是将generated dasses改成CcommDlg,然后finish 4, 将新生成的项目的对话框默认dialog edit删去,如图 5,在对话框中加入两个st

嵌入式Linux裸机开发(七)——UART串口通信

嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER, 它用来传输串行数据.发送数据时, CPU 将并行数据写入UART,UAR按照一定的格式在一根电线上串 行发出:接收数据时, UART检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210中, UART提供了 4 对独立的异步串口I/O端口,

51单片机之串口通信(一)

一.基础知识 1.串行通信和并行通信:目前用的比较多的是串行通信.串行通信优点是连接简单,传输距离远:缺点是传输速度慢. 2.串行通信:分为同步通信和异步通信:异步通信是指发送和接收设备利用各自的时钟控制数据的发送和接收. 3.串行通信的传输方向:单工,半双工,全双工. 4.波特率:每秒钟传输2进制代码的位数,如1个字节为10位,每秒传输240个字节,则波特率为10*240=2400bps,单位是bps: 5.RS-232C:25个管脚,我们用到的是PGND(保护接地).TXD(发送数据),RX

转:Qt编写串口通信程序全程图文讲解

转载:http://blog.csdn.net/yafeilinux/article/details/4717706  作者:yafeilinux (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qextser

C#串口通信—向串口发送数据,同步接收返回数据

最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件.经过测试,可以正常使用(不支持多线程调用). 一.Machine类 1.Machine类有一个静态变量,定义如下: private static SerialPort serialPort = null; 2.向串口发送数据,同步接收返回数据的方

LabVIEW上位机与串口通信

渊源 大一的时候,学校开了门公共选修课,叫LabVIEW编程,当时的我当然还不知道LabVIEW是啥东东,但还是选了.上课的老师是机械学院的一个副教授,他给我们展示了好几个用LabVIEW做的项目,譬如油箱监控上位机等,已经不太记得了.后来随着学习单片机.ARM等的串口操作,有时候一个漂亮的上位机(尤其是能显示波形的上位机)在项目中给用户展示非常的有用.过了这么多年,虽然曾经也用LabVIEW写过简单的温度监控上位机,但这次再拿起LabVIEW又好像从头开始一样,语法几已忘记殆尽! 定义通信格式

Qt 串口通信

在Qt5之前,串口通信基本依赖于第三方库,下面是我曾接触过的串口通信类库: 名称 语言 平台   QextSerialPort QT C++ Win/Linux http://sourceforge.net/projects/qextserialport/files/ QSerialPort QT C++ QT5已经集成 libserial C++ Linux http://files.cnblogs.com/kyyblabla/libserial-0.5.2.gz.7z 以上串口通信类库通信过

SPCOMM控件在Delphi串口通信中的应用

SPCOMM控件在Delphi串口通信中的应用 2010-07-08 22:20:31|  分类: 个人日记 |举报 |字号 订阅 2009-03-01 05:35 摘要:利用Delphi开发工业控制系统软件成为越来越多的开发人员的选择,而串口通信是这个过程中必须解决的问题之一.本文在对几种常用串口通信方法分析比较的基础上,着重讨论了Delphi开发环境下利用Spcomm控件实现PC机与单片机之间串口通信的方法,研究了Spcomm串口通信的关键技术问题,并通过一个实例给出了Spcomm控件在De

boost 串口通信

boost库有一个asio,支持串口通信. 步骤: 1.产生一个boost::asio::io_service(前摄模式,类似于完成端口,不过,可以针对不同IO对象) 2.构造一个boost::asio::serial_port,有两种方法: (一)boost::asio::serial_port m_serialPort(m_IoService, "COM1"); (二)boost::asio::serial_port m_serialPort(m_IoService); m_ser