012.c串口操作系列入门篇一个简陋例子_第1页
012.c串口操作系列入门篇一个简陋例子_第2页
012.c串口操作系列入门篇一个简陋例子_第3页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、我假设读者已经了解了c#的语法,本文是针对刚打算解除串口编程的朋友阅读的,作为串口编程的入门范例,也是我这个系列的基础。我们的开发环境假定为vs2005(虽然我在用vs2010,但避免有些网友用2005,不支持lambda,避免不兼容,就用2005来做例子)一个基本的串口程序,既然是个程序了。我们就先从功能说起,包含串口选择波特率选择打开关闭接受数据显示发送数据输入发送数据数据量提示以及归零好吧,有了这些功能,我们就先画出界面。例如:这里,波特率就定死几种好了。直接界面上添加2400,4800,9600,19200,38400,57600,115200comboPortName这里,为了我们的

2、软件能通用所有电脑避免每次查询的效率损失,我们使用微软提供的枚举方式,代码如下:c-sharp HYPERLINK /wuyazhe/article/details/5598945 o view plain view plain HYPERLINK /wuyazhe/article/details/5598945 o copy copy HYPERLINK /wuyazhe/article/details/5598945 o print print HYPERLINK /wuyazhe/article/details/5598945 o ? ?stringports=SerialPort.Ge

3、tPortNames();Array.Sort(ports);comboPortName.Items.AddRange(ports);显然,我们需要定义一个SerialPort对象。添加DataReceived事件响应收到数据,还有一个重点,我们需要记得设置NewLine属性哦。好想有的版本不设置的时候,WriteLine和Write效果一样。所以,我们需要初始化SerialPort对象,例如:c-sharp HYPERLINK /wuyazhe/article/details/5598945 o view plain view plain HYPERLINK /wuyazhe/article

4、/details/5598945 o copy copy HYPERLINK /wuyazhe/article/details/5598945 o print print HYPERLINK /wuyazhe/article/details/5598945 o ? ?/初始化SerialPort对象 comm.NewLine=/r/n;comm.RtsEnable=true;/根据实际情况吧。 /添加事件注册 comm.DataReceived+=comm_DataReceived;初始化好串口,简单的编写打开,关闭方法,编写界面响应的是否自动换行,如何复位计数器,发送方法。以及数据处理。因为

5、我已经写了完整注视,我就直接贴代码了。 c-sharp HYPERLINK /wuyazhe/article/details/5598945 o view plain view plain HYPERLINK /wuyazhe/article/details/5598945 o copy copy HYPERLINK /wuyazhe/article/details/5598945 o print print HYPERLINK /wuyazhe/article/details/5598945 o ? ?usingSystem;usingSystem.Collections.Generic;u

6、singSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO.Ports;usingSystem.Text.RegularExpressions;namespaceSerialportSamplepublicpartialclassSerialportSampleForm:FormprivateSerialPortcomm=newSerialPort();privateStringB

7、uilderbuilder=newStringBuilder();/避免在事件处理方法中反复的创建,定义到外面。 privatelongreceived_count=0;/接收计数 privatelongsend_count=0;/发送计数 publicSerialportSampleForm()InitializeComponent();/窗体初始化 privatevoidForm1_Load(objectsender,EventArgse)/初始化下拉串口名称列表框 stringports=SerialPort.GetPortNames();Array.Sort(ports);comboP

8、ortName.Items.AddRange(ports);comboPortName.SelectedIndex=comboPortName.Items.Count0?0:-1;comboBaudrate.SelectedIndex=comboBaudrate.Items.IndexOf(9600);/初始化SerialPort对象 comm.NewLine=/r/n;comm.RtsEnable=true;/根据实际情况吧。 /添加事件注册 comm.DataReceived+=comm_DataReceived;voidcomm_DataReceived(objectsender,Ser

9、ialDataReceivedEventArgse)intn=comm.BytesToRead;/先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致 bytebuf=newbyten;/声明一个临时数组存储当前来的串口数据 received_count+=n;/增加接收计数 comm.Read(buf,0,n);/读取缓冲数据 builder.Clear();/清除字符串构造器的内容 /因为要访问ui资源,所以需要使用invoke方式同步ui。 this.Invoke(EventHandler)(delegate/判断是否是显示为16禁止 if(checkBoxHexView

10、.Checked)/依次的拼接出16进制字符串 foreach(bytebinbuf)builder.Append(b.ToString(X2)+);else/直接按ASCII规则转换成字符串 builder.Append(Encoding.ASCII.GetString(buf);/追加的形式添加到文本框末端,并滚动到最后。 this.txGet.AppendText(builder.ToString();/修改接收计数 labelGetCount.Text=Get:+received_count.ToString(););privatevoidbuttonOpenClose_Click(o

11、bjectsender,EventArgse)/根据当前串口对象,来判断操作 if(comm.IsOpen)/打开时点击,则关闭串口 comm.Close();else/关闭时点击,则设置好端口,波特率后打开 comm.PortName=comboPortName.Text;comm.BaudRate=int.Parse(comboBaudrate.Text);trycomm.Open();catch(Exceptionex)/捕获到异常信息,创建一个新的comm对象,之前的不能用了。 comm=newSerialPort();/现实异常信息给客户。 MessageBox.Show(ex.Me

12、ssage);/设置按钮的状态 buttonOpenClose.Text=comm.IsOpen?Close:Open;buttonSend.Enabled=comm.IsOpen;/动态的修改获取文本框是否支持自动换行。 privatevoidcheckBoxNewlineGet_CheckedChanged(objectsender,EventArgse)txGet.WordWrap=checkBoxNewlineGet.Checked;privatevoidbuttonSend_Click(objectsender,EventArgse)/定义一个变量,记录发送了几个字节 intn=0;

13、/16进制发送 if(checkBoxHexSend.Checked)/我们不管规则了。如果写错了一些,我们允许的,只用正则得到有效的十六进制数 MatchCollectionmc=Regex.Matches(txSend.Text,(?i)/da-f2);Listbuf=newList();/填充到这个临时列表中 /依次添加到列表中 foreach(Matchminmc)buf.Add(byte.Parse(m.Value);/转换列表为数组后发送 comm.Write(buf.ToArray(),0,buf.Count);/记录发送的字节数 n=buf.Count;else/ascii编码

14、直接发送 /包含换行符 if(checkBoxNewlineSend.Checked)comm.WriteLine(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();/更新界面 privatevoidbuttonReset_Click(objectsender,EventArgse)/复位接受和发送的字节数计数器并更新界面。 send_count=received_count=0;labelGetCount.Text=Get:0;labelSendCount.Text=Send:0;至此,一个标准的串口调试助手就完成了。留下一个思考题,如果接收数据后,更新界面的时候,尚未操作完成,此时并发了关闭串口的操作。程序会如何呢?敬请阅读C# 串口操作系列(2) - 如何避免关闭串口偶尔软件死锁。 HYPERLINK /down/2360835/wuyazhe VS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论