串口调试小助手大体设计文档_第1页
串口调试小助手大体设计文档_第2页
串口调试小助手大体设计文档_第3页
串口调试小助手大体设计文档_第4页
串口调试小助手大体设计文档_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

1、C#编写串口调试小助手设计文档 /*/ /*文档名称:C#编写串口调试小助手设计文档 */ /*操作系统:win7 X64 */ /*编译软件:Virtual Studio 2010 */ /*编译环境:.Net FrameWork 4.0 */ /*时间 :2014/7/24 */ /*Author : 软星包子 */ /*/ 目录1. 定义程序的的命名空间静态主函数( static main)12. 定义程序会用到的类包及全局变量23. 初始化窗体,初始化窗体控件属性与事件24. 点击 打开串口/关闭串口 对应的 Click 事件处理2a打开端口/关闭串口 事件处理所需要的函数3b.读取串

2、口的事件处理 ,委托与线程45. 初始化 SerialPort对象,检测当前系统下可用端口,检测当前用户相关配置信息66.DataReceived事件委托方法77.数据发送事件处理88. 写数据操作,利用线程循环发送数据9a. 数据转换,将16进制数转化为字节型数据119.复选框:强制转换为16进制事件处理12a.普通文本转换为16进制值1210.清空按钮清空listBox和richTextBox的文本区1211.点击“关于我们按钮”在主窗体中打开其他窗体1312.窗体布局及消息盒提示1313. 窗体布局及相应控件介绍141. 定义程序的的命名空间静态主函数( static main)name

3、space VCCom static class Program / <summary> / 应用程序的主入口点。 / </summary> STAThread static void Main() Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FormCOM(); /定义程序启动默认加载的窗体 /可以通过修改 FormCOM() 来启动需要默认打开的窗体。 2. 定义程序会用到的类包及全局变量usin

4、g System.IO;using System.IO.Ports;using System.Threading; /定义 SerialPort对象 SerialPort SerialPortcom; Thread _readThread; /用Thread线程类定义线程对象 _readThread bool _keepReading;3. 初始化窗体,初始化窗体控件属性与事件 public FormCOM() InitializeComponent();/该方法中包含窗体中所用空间的属性和事件4. 点击 打开串口/关闭串口 对应的 Click 事件处理 private void button

5、_OpenCOM_Click(object sender, EventArgs e) /button_OpenCOM.Text = button_OpenCOM.Text = "打开串口" ? "关闭串口" : "打开串口" if (button_OpenCOM.Text = "打开串口") /条件判断,如果按钮当前的文本为:“打开串口”,则将它的文本改为“关闭串口”,同时将pictureBox1.Image属性更换为D:02.ico,但要保证图片的路径正确,否则会报异常。 button_OpenCOM.Text

6、= "关闭串口" button_OpenCOM.BackColor =Color.HotPink; Image img = Image.FromFile("D:02.ico");/路径要确保正确(位图文件放在“串口调试小助手目录下,需把文件放在D盘,或修改以上路径。”) / this.pictureBox1.Image. 每次点击按钮pictureBox1都对更换图片 this.pictureBox1.Image = img; String str_PortName = boBox_ComName.Text.Trim(); SerialPortcom =

7、 new SerialPort(); SerialPortcom.BaudRate = Convert.ToInt32(boBox_Baudrate.Text.Trim();/波特率: 9600;/115200 SerialPortcom.PortName = boBox_ComName.Text.Trim(); try SerialPortcom.Open();/打开串口 catch (UnauthorizedAccessException IOe) /MessageBox.Show(IOe.Message); /textBox_COMStatus.Text=IOe.Message; thi

8、s.listBox_TiShi.Items.Add(IOe.Message); MessageBox.Show(boBox_ComName.Text.Trim() + "串口被占用");/以消息盒的形式弹出警告 return; catch (IOException IOe) /textBox_COMStatus.Text = IOe.Message; /MessageBox.Show(IOe.Message); this.listBox_TiShi.Items.Add(IOe.Message); return; this.listBox_TiShi.Items.Add(st

9、r_PortName + "成功打开串口"); _keepReading = true; _readThread = new Thread(ReadPort); /将读到的串口数据作为参数送给Thread线程,创建 _readThread 线程对象,来循环读取串口数据 _readThread.Start(); else button_OpenCOM.Text = "关闭串口" button_OpenCOM.BackColor =Color.DarkGray; Image img= Image.FromFile("D:01.ico");

10、 this.pictureBox1.Image = img; _keepReading = false; Thread.Sleep(100); ClosePort(SerialPortcom); a打开端口/关闭串口 事件处理所需要的函数 private void showCOMName() string portList = System.IO.Ports.SerialPort.GetPortNames(); /获取串口的名称 comboBox_ComName.Items.Clear(); for (int i = 0; i < portList.Length; +i) string

11、name = portListi; boBox_ComName.Items.Add(name); /关闭串口的方法 public void ClosePort(SerialPort port) if (port = null) this.listBox_TiShi.Items.Add("串口不存在"); MessageBox.Show("串口不存在,请重新选择!"); try port.Close(); if (!port.IsOpen) /Console.WriteLine("串口已经被关闭!"); this.listBox_TiS

12、hi.Items.Add(port.PortName + " 成功关闭"); catch (NullReferenceException) b.读取串口的事件处理 ,委托与线程 private void ReadPort() while (_keepReading) if (SerialPortcom.IsOpen) try StringBuilder currentline = new StringBuilder(); /循环接收数据 while (SerialPortcom.BytesToRead > 0) char ch = (char)SerialPortco

13、m.ReadByte(); currentline.Append(ch); /String SerialIn = System.Text.Encoding.ASCII.GetString(readBuffer, 0, count); /在这里对接收到的数据进行处理 /-委托 - this.textBox_Read.Invoke( /在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate) /即在textBox_ReceiveDate控件的父窗口form中执行委托. new MethodInvoker( /*表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数

14、的任何方法。 在对控件的 Invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。*/ delegate /*匿名方法,C#2.0的新功能,这是一种允许程序员将一段完整代码区块当成参数传递的程序代码编写技术,通过此种方法可 以直接使用委托来设计事件响应程序以下就是你要在主线程上实现的功能但是有一点要注意,这里不适宜处理过多的方法,因为C#消息机制是消息流水线响应机制,如果这里在主线程上处理语句的时间过长会导致主UI线程阻塞,停止响应或响应不顺畅,这时你的主form界面会延迟或卡死 */ if (currentline.ToString().Length > 0) /

15、this.textBox_Read.Text = currentline.ToString() + "," /this.richTextBox_Read.AppendText(currentline.ToString(); if (checkBox_Show16_1.Checked) this.textBox_Read.Text = ClassFunctions.StrToHexStr(currentline.ToString(); this.richTextBox_Read.AppendText(ClassFunctions.StrToHexStr(currentline

16、.ToString(); else this.textBox_Read.Text = currentline.ToString(); this.richTextBox_Read.AppendText(currentline.ToString(); ) ); /-委托end-/this.textBox_Read.Text = currentline.ToString(); currentline = new StringBuilder(); catch (Exception ex) Console.WriteLine(ex.Message.ToString(); else TimeSpan wa

17、itTime = new TimeSpan(0, 0, 0, 0, 500); /TimeSpan:(系统方法) 将新的 System.TimeSpan 初始化为指定的天数、小时数、分钟数、秒数和 毫秒数。 Thread.Sleep(waitTime); /主线程休眠500ms等待子线程结束 try this.listBox_TiShi.Items.Add("线程退出"); catch(Exception) 5. 初始化 SerialPort对象,检测当前系统下可用端口,检测当前用户相关配置信息 /初始化SerialPort对象方法.PortName为COM口名称,例如&q

18、uot;COM1","COM2"等,注意是string类型 public void InitCOM(string PortName) SerialPortcom = new SerialPort(PortName); SerialPortcom.BaudRate=Convert.ToInt32(boBox_Baudrate.Text.Trim();/波特率 4800,9600,115200,256000 SerialPortcom.Parity = Parity.None;/无奇偶校验位 SerialPortcom.StopBits = StopBits.Two;

19、/两个止位 SerialPortcom.Handshake = Handshake.RequestToSend;/控制协议 SerialPortcom.ReceivedBytesThreshold = 4;/设置 DataReceived 事件发生前内部输入缓冲区中的字节数 SerialPortcom.DataReceived+=new SerialDataReceivedEventHandler(port1_DataReceived);/DataReceived事件委托 6.DataReceived事件委托方法 /DataReceived事件委托方法 private void OnDataR

20、eceived(object sender, SerialDataReceivedEventArgs e) try StringBuilder currentline = new StringBuilder(); /循环接收数据 while (SerialPortcom.BytesToRead > 0) char ch = (char)SerialPortcom.ReadByte(); currentline.Append(ch); /文本追加 /在这里对接收到的数据进行处理 this.textBox_Read.Invoke( /在拥有此控件的基础窗口句柄的线程上执行委托Invoke(D

21、elegate) /即在textBox_ReceiveDate控件的父窗口form中执行委托. new MethodInvoker( /*表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。 在对控件的 Invoke 方法进行调用时或需要一个简单委托又不想自己定义时可以使用该委托。*/ delegate /*匿名方法,C#2.0的新功能,这是一种允许程序员将一段完整代码区块当成参数传递的程序代码编写技术,通过此种方法可 以直接使用委托来设计事件响应程序以下就是你要在主线程上实现的功能但是有一点要注意,这里不适宜处理过多的方法,因为C#消息机制是消息流水线响应机制,

22、如果这里在主线程上处理语句的时间过长会导致主UI线程阻塞,停止响应或响应不顺畅,这时你的主form界面会延迟或卡死 */ this.textBox_Read.Text=currentline.ToString();/输出到主窗口文本控件 this.richTextBox_Read.AppendText(currentline.ToString();/输出到主窗口文本控件 +"n" /this.textBox_Read.Text += " " ) ); /this.textBox_Read.Text = currentline.ToString(); cu

23、rrentline = new StringBuilder(); catch (Exception ex) Console.WriteLine(ex.Message.ToString(); / DataReceived事件委托方法 private void port1_DataReceived(object sender, SerialDataReceivedEventArgs e) try StringBuilder currentline = new StringBuilder(); /循环接收数据 char ch='0' while (SerialPortcom.Byte

24、sToRead > 0) ch = (char)SerialPortcom.ReadByte(); / currentline.Append(ch); /在这里对接收到的数据进行处理 / /- / this.textBox_Read.Invoke( / /在拥有此控件的基础窗口句柄的线程上执行委托Invoke(Delegate) / /即在textBox_ReceiveDate控件的父窗口form中执行委托. /new MethodInvoker( / /*表示一个委托,该委托可执行托管代码中声明为 void 且不接受任何参数的任何方法。 在对控件的 Invoke 方法进行调用时或需要一

25、个简单委托又不想自己定义时可以使用该委托。*/ /delegate / / /*匿名方法,C#2.0的新功能,这是一种允许程序员将一段完整代码区块当成参数传递的程序代码编写技术,通过此种方法可 以直接使用委托来设计事件响应程序以下就是你要在主线程上实现的功能但是有一点要注意,这里不适宜处理过多的方法,因为C#消息机制是消息流水线响应机制,如果这里在主线程上处理语句的时间过长会导致主UI线程阻塞,停止响应或响应不顺畅,这时你的主form界面会延迟或卡死 */ this.textBox_Read.AppendText(ch.ToString();/输出到主窗口文本控件 this.textBox_R

26、ead.Text += "kk " currentline = new StringBuilder(); catch(Exception ex) Console.WriteLine(ex.Message.ToString(); 7.数据发送事件处理 private void button_Send_Click(object sender, EventArgs e) String str_Send =this.richTextBox_Send.Text; if (str_Send.Length > 0) / this.WriteCom(SerialPortcom, st

27、r_Send, 3); SendCommand(str_Send, SerialPortcom); /向串口发送数据 public void SendCommand(string CommandString, SerialPort port) byte WriteBuffer = Encoding.ASCII.GetBytes(CommandString); /字符编码,继承自接口 ICloneable try port.Write(WriteBuffer,0,WriteBuffer.Length);/ port.Write(CommandString); catch(Exception e)

28、 MessageBox.Show("Exception:串口关闭或被占用n" + e);/如果串口被关闭或被占用,以消息窗的形式提示“串口被关闭或被占用”,并打印异常。 8. 写数据操作,利用线程循环发送数据 / <summary> / WriteCom(SerialPort COMport, String CommandString, int num) 写串口 / 参数:SerialPort COMport:已打开的串口 / String CommandString:需要发送的数据, / int num:循环发送次数,如果发送成功则忽略该参数 / 返回值:写成

29、功则返回"0", / </summary> / <returns></returns> public String WriteCom(SerialPort COMport, String CommandString, int num) String str_Return = "-1" if (COMport = null) | (!COMport.IsOpen) return "Com_Closed" /try / COMport.DiscardInBuffer();/ serialPort.Dis

30、cardInBuffer(); /清空接收缓冲区 COMport.DiscardOutBuffer(); CommandString = CommandString.Trim(); if (CommandString.Length < 1) str_Return = "-1" else byte WriteBuffer = HexStringToByteArray(CommandString); for (int i = 0; i < num; i+) try /COMport.Write(CommandString);/写指令,该指令返回 00 00 00 6

31、8 00 00 00 53 00 00 AC 67 16 for (int k = 0; k < WriteBuffer.Length && COMport != null; k+) byte WriteBuffer_2 = new byte1; WriteBuffer_20 = WriteBufferk; COMport.Write(WriteBuffer_2, 0, WriteBuffer_2.Length);/ 写指令,该指令返回 00 00 00 68 00 00 00 53 00 00 AC 67 16/COMport.Write(WriteBuffer, 0,

32、 WriteBuffer.Length);/ 写指令,该指令返回 00 00 00 68 00 00 00 53 00 00 AC 67 16 /byte WriteBuffer_3 = new byte1; /WriteBuffer_30=Convert .ToByte(WriteBuffer1); /COMport.Write(WriteBuffer_3, 0, WriteBuffer_3.Length); str_Return = "0" break;/发送成功则跳出for循环 catch (TimeoutException e) str_Return = e.Mes

33、sage; catch (System.IO.IOException e) str_Return = e.Message; return str_Return; a. 数据转换,将16进制数转化为字节型数据 / <summary> Convert a string of hex digits (ex: E4 CA B2) to a byte array. </summary> / <param name="s"> The string containing the hex digits (with or without spaces).

34、</param> / <returns> Returns an array of bytes. </returns> public static byte HexStringToByteArray(string s) /将 (Hex) 16进制的数据转化为字节型数据 s = s.Replace(" ", ""); /去除空格 if (s.Length < 1) return null; if (s.Length % 2 != 0) s = "0" + s; byte buffer = new

35、bytes.Length / 2;/每两位为一组,表示1个字节。 try for (int i = 0; i < s.Length; i += 2) bufferi / 2 = (byte)Convert.ToByte(s.Substring(i, 2), 16); /将字符转化为字节类型/每两位为一组,表示1个字节。 SubString 为系统函数,函数原型如下: public string Substring(int startIndex); / / 摘要: / 从此实例检索子字符串。子字符串从指定的字符位置开始且具有指定的长度。 / / 参数: / startIndex: / 此实

36、例中子字符串的起始字符位置(从零开始)。 / / length: / 子字符串中的字符数。 / / 返回结果: / 与此实例中在 startIndex 处开头、长度为 length 的子字符串等效的一个字符串,如果 startIndex 等于此实例的长度且 length / 为零,则为 System.String.Empty。 / / 异常: / System.ArgumentOutOfRangeException: / startIndex 加 length 之和指示的位置不在此实例中。- 或 -startIndex 或 length 小于零。 catch (FormatException) return null; return buffer; 9.复选框:强制转换为16进制事件处理private void checkBox_Turn16_1_CheckedChanged(object sender, EventArgs e)

温馨提示

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

评论

0/150

提交评论