《2022年串口程序 .pdf》由会员分享,可在线阅读,更多相关《2022年串口程序 .pdf(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、我假设读者已经了解了c#的语法,本文是针对刚打算解除串口编程的朋友阅读的,作为串口编程的入门范例,也是我这个系列的基础。我们的开发环境假定为vs2005(虽然我在用vs2010, 但避免有些网友用2005, 不支持 lambda,避免不兼容,就用2005 来做例子 ) 一个基本的串口程序,既然是个程序了。我们就先从功能说起,包含串口选择波特率选择打开关闭接受数据显示发送数据输入发送数据数据量提示以及归零好吧,有了这些功能,我们就先画出界面。例如:这里,波特率就定死几种好了。直接界面上添加2400,4800,9600,19200,38400,57600,115200 comboPortName
2、这里, 为了我们的软件能通用所有电脑避免每次查询的效率损失,我们使用微软提供的枚举方式,代码如下:view plaincopy to clipboardprint? string ports = SerialPort.GetPortNames(); Array.Sort(ports); comboPortName.Items.AddRange(ports); string ports = SerialPort.GetPortNames(); Array.Sort(ports); comboPortName.Items.AddRange(ports); 显然,我们需要定义一个SerialPort
3、 对象。添加DataReceived 事件响应收到数据,还有一个重点, 我们需要记得设置NewLine 属性哦。 好想有的版本不设置的时候,WriteLine 和 Write效果一样。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 9 页 - - - - - - - - - 所以,我们需要初始化SerialPort 对象,例如:view plaincopy to clipboardprint? /初始化 SerialPort 对象comm.NewLine = rn; co
4、mm.RtsEnable = true;/ 根据实际情况吧。/添加事件注册comm.DataReceived += comm_DataReceived; /初始化 SerialPort 对象comm.NewLine = rn; comm.RtsEnable = true;/ 根据实际情况吧。/添加事件注册comm.DataReceived += comm_DataReceived; 初始化好串口,简单的编写打开,关闭方法,编写界面响应的是否自动换行,如何复位计数器,发送方法。以及数据处理。因为我已经写了完整注视,我就直接贴代码了。view plaincopy to clipboardprint
5、? using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; using System.Text.RegularExpressions; namespace SerialportSample public partial class Seria
6、lportSampleForm : Form private SerialPort comm = new SerialPort(); private StringBuilder builder = new StringBuilder();/避免在事件处理方法中反复的创建,定义到外面。private long received_count = 0;/ 接收计数private long send_count = 0;/ 发送计数public SerialportSampleForm() InitializeComponent(); 名师资料总结 - - -精品资料欢迎下载 - - - - - -
7、- - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 9 页 - - - - - - - - - /窗体初始化private void Form1_Load(object sender, EventArgs e) /初始化下拉串口名称列表框string ports = SerialPort.GetPortNames(); Array.Sort(ports); comboPortName.Items.AddRange(ports); comboPortName.SelectedIndex = comboPortName.Items.Count
8、0 ? 0 : -1; comboBaudrate.SelectedIndex = comboBaudrate.Items.IndexOf(9600); /初始化 SerialPort 对象comm.NewLine = rn; comm.RtsEnable = true;/ 根据实际情况吧。/添加事件注册comm.DataReceived += comm_DataReceived; void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) int n = comm.BytesToRead;/ 先记录下来,避免某种原
9、因,人为的原因,操作几次之间时间长,缓存不一致byte buf = new byten;/ 声明一个临时数组存储当前来的串口数据received_count += n;/ 增加接收计数comm.Read(buf, 0, n);/ 读取缓冲数据builder.Clear();/ 清除字符串构造器的内容/因为要访问ui 资源,所以需要使用invoke 方式同步ui。this.Invoke(EventHandler)(delegate /判断是否是显示为16 禁止if (checkBoxHexView.Checked) /依次的拼接出16 进制字符串foreach (byte b in buf) b
10、uilder.Append(b.ToString(X2) + ); else /直接按 ASCII 规则转换成字符串builder.Append(Encoding.ASCII.GetString(buf); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 9 页 - - - - - - - - - /追加的形式添加到文本框末端,并滚动到最后。this.txGet.AppendText(builder.ToString(); /修改接收计数labelGetCount.Tex
11、t = Get: + received_count.ToString(); ); private void buttonOpenClose_Click(object sender, EventArgs e) /根据当前串口对象,来判断操作if (comm.IsOpen) /打开时点击,则关闭串口comm.Close(); else /关闭时点击,则设置好端口,波特率后打开comm.PortName = comboPortName.Text; comm.BaudRate = int.Parse(comboBaudrate.Text); try comm.Open(); catch(Excepti
12、on ex) /捕获到异常信息,创建一个新的comm 对象,之前的不能用了。comm = new SerialPort(); /现实异常信息给客户。MessageBox.Show(ex.Message); /设置按钮的状态buttonOpenClose.Text = comm.IsOpen ? Close : Open; buttonSend.Enabled = comm.IsOpen; /动态的修改获取文本框是否支持自动换行。private void checkBoxNewlineGet_CheckedChanged(object sender, EventArgs e) txGet.Wor
13、dWrap = checkBoxNewlineGet.Checked; private void buttonSend_Click(object sender, EventArgs e) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 9 页 - - - - - - - - - /定义一个变量,记录发送了几个字节int n = 0; /16 进制发送if (checkBoxHexSend.Checked) /我们不管规则了。如果写错了一些,我们允许的,只用正则得到有效的十
14、六进制数MatchCollection mc = Regex.Matches(txSend.Text, (?i)da-f2); List buf = new List();/填充到这个临时列表中/依次添加到列表中foreach (Match m in mc) buf.Add(byte.Parse(m.Value); /转换列表为数组后发送comm.Write(buf.ToArray(), 0, buf.Count); /记录发送的字节数n = buf.Count; else/ascii 编码直接发送 /包含换行符if (checkBoxNewlineSend.Checked) comm.Wri
15、teLine(txSend.Text); n = txSend.Text.Length + 2; else/不包含换行符 comm.Write(txSend.Text); n = txSend.Text.Length; send_count += n;/ 累加发送字节数labelSendCount.Text = Send: + send_count.ToString();/ 更新界面 private void buttonReset_Click(object sender, EventArgs e) /复位接受和发送的字节数计数器并更新界面。send_count = received_coun
16、t = 0; labelGetCount.Text = Get:0; labelSendCount.Text = Send:0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 9 页 - - - - - - - - - using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using Sys
17、tem.Linq; using System.Text; using System.Windows.Forms; using System.IO.Ports; using System.Text.RegularExpressions; namespace SerialportSample public partial class SerialportSampleForm : Form private SerialPort comm = new SerialPort(); private StringBuilder builder = new StringBuilder();/避免在事件处理方法
18、中反复的创建,定义到外面。private long received_count = 0;/ 接收计数private long send_count = 0;/ 发送计数public SerialportSampleForm() InitializeComponent(); /窗体初始化private void Form1_Load(object sender, EventArgs e) /初始化下拉串口名称列表框string ports = SerialPort.GetPortNames(); Array.Sort(ports); comboPortName.Items.AddRange(p
19、orts); comboPortName.SelectedIndex = comboPortName.Items.Count 0 ? 0 : -1; comboBaudrate.SelectedIndex = comboBaudrate.Items.IndexOf(9600); /初始化 SerialPort 对象comm.NewLine = rn; comm.RtsEnable = true;/ 根据实际情况吧。/添加事件注册名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,
20、共 9 页 - - - - - - - - - comm.DataReceived += comm_DataReceived; void comm_DataReceived(object sender, SerialDataReceivedEventArgs e) int n = comm.BytesToRead;/ 先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致byte buf = new byten;/ 声明一个临时数组存储当前来的串口数据received_count += n;/ 增加接收计数comm.Read(buf, 0, n);/ 读取缓冲数据builder.
21、Clear();/ 清除字符串构造器的内容/因为要访问ui 资源,所以需要使用invoke 方式同步ui。this.Invoke(EventHandler)(delegate /判断是否是显示为16 禁止if (checkBoxHexView.Checked) /依次的拼接出16 进制字符串foreach (byte b in buf) builder.Append(b.ToString(X2) + ); else /直接按 ASCII 规则转换成字符串builder.Append(Encoding.ASCII.GetString(buf); /追加的形式添加到文本框末端,并滚动到最后。thi
22、s.txGet.AppendText(builder.ToString(); /修改接收计数labelGetCount.Text = Get: + received_count.ToString(); ); private void buttonOpenClose_Click(object sender, EventArgs e) /根据当前串口对象,来判断操作if (comm.IsOpen) /打开时点击,则关闭串口comm.Close(); else 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
23、- - - - 第 7 页,共 9 页 - - - - - - - - - /关闭时点击,则设置好端口,波特率后打开comm.PortName = comboPortName.Text; comm.BaudRate = int.Parse(comboBaudrate.Text); try comm.Open(); catch(Exception ex) /捕获到异常信息,创建一个新的comm 对象,之前的不能用了。comm = new SerialPort(); /现实异常信息给客户。MessageBox.Show(ex.Message); /设置按钮的状态buttonOpenClose.Te
24、xt = comm.IsOpen ? Close : Open; buttonSend.Enabled = comm.IsOpen; /动态的修改获取文本框是否支持自动换行。private void checkBoxNewlineGet_CheckedChanged(object sender, EventArgs e) txGet.WordWrap = checkBoxNewlineGet.Checked; private void buttonSend_Click(object sender, EventArgs e) /定义一个变量,记录发送了几个字节int n = 0; /16 进制发
25、送if (checkBoxHexSend.Checked) /我们不管规则了。如果写错了一些,我们允许的,只用正则得到有效的十六进制数MatchCollection mc = Regex.Matches(txSend.Text, (?i)da-f2); List buf = new List();/填充到这个临时列表中/依次添加到列表中foreach (Match m in mc) buf.Add(byte.Parse(m.Value); /转换列表为数组后发送名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - -
26、 - - - - - 第 8 页,共 9 页 - - - - - - - - - comm.Write(buf.ToArray(), 0, buf.Count); /记录发送的字节数n = buf.Count; else/ascii 编码直接发送 /包含换行符if (checkBoxNewlineSend.Checked) comm.WriteLine(txSend.Text); n = txSend.Text.Length + 2; else/不包含换行符 comm.Write(txSend.Text); n = txSend.Text.Length; send_count += n;/ 累
27、加发送字节数labelSendCount.Text = Send: + send_count.ToString();/ 更新界面 private void buttonReset_Click(object sender, EventArgs e) /复位接受和发送的字节数计数器并更新界面。send_count = received_count = 0; labelGetCount.Text = Get:0; labelSendCount.Text = Send:0; 至此, 一个标准的串口调试助手就完成了。留下一个思考题,如果接收数据后,更新界面的时候,尚未操作完成,此时并发了关闭串口的操作。x 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 9 页 - - - - - - - - -