C# 串口调试助手源码
本方法,禁用跨进程错误(做法不太好,但是对于单片机出身的人来说,好理解,能用就行)。
基本功能:
1.点串口号的下拉菜单自动当前检索设备管理器的COM
2.发送模式可选,hex和string两种
3.接收显示模式,hex和string两种
4.发送多行数据
5.发送单行,可增加自动换行(方便用于一些串口指令,很多指令都带回车,每次写回车太麻烦)
效果演示:
主代码参考:
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.IO.Ports;
- using System.Linq;
- using System.Text;
- using System.Windows.Forms;
- namespace SerialTools
- {
- public partial class Form1 : Form
- {
- private long RxCount = ;
- public Form1()
- {
- InitializeComponent();
- System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
- }
- #region 初始化Form
- private void Form1_Load(object sender, EventArgs e)
- {
- pictureBox1.Image = Properties.Resources.off;
- ////查询当前有用的串口号
- //SerialPort.GetPortNames();
- //string[] ports = SerialPort.GetPortNames();
- //foreach (string port in ports)
- //{
- // cb_com.Items.Add(port);
- //}
- serialPort1.BaudRate = ;
- serialPort1.DataBits = ;
- serialPort1.StopBits = (StopBits);
- //迭代所有的波特率
- string[] tab_Baud = new string[] { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" };
- foreach (string str in tab_Baud)
- {
- cb_Baud.Items.Add(str);
- }
- //迭代所有的数据位
- string[] tab_data = new string[] { "", "", "", "" };
- foreach (string str in tab_data)
- {
- cb_DataBits.Items.Add(str);
- }
- //迭代所有的停止位
- string[] tab_stop = new string[] { "", "" };
- foreach (string str in tab_stop)
- {
- cb_StopBits.Items.Add(str);
- }
- cb_Baud.Text = "";
- cb_DataBits.Text = "";
- cb_StopBits.Text = "";
- serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);//添加事件
- }
- #endregion
- #region 接收数据
- private void port_DataReceived(object sender,SerialDataReceivedEventArgs e) {
- if (!checkBox_receiveMode.Checked)//没有勾选hex时候,按照字符串方式读取
- {
- string str = serialPort1.ReadExisting();//字符串方式读
- textBox_receive.AppendText(str); //添加内容
- RxCount += str.Length;
- }
- else {
- byte data;
- data = (byte)serialPort1.ReadByte();
- string str = Convert.ToString(data, ).ToUpper();
- textBox_receive.AppendText((str.Length == ? "" + str : str)+" ");//空位补"0"
- RxCount += str.Length;
- }
- label_ReceiveCount.Text = RxCount.ToString();
- }
- #endregion
- #region 清空接收计数器和接收显示区域
- private void button4_Click(object sender, EventArgs e)
- {
- textBox_receive.Text = "";
- RxCount = ;
- label_ReceiveCount.Text = RxCount.ToString();
- }
- #endregion
- #region 打开/关闭串口
- private void button1_Click(object sender, EventArgs e)
- {
- if (!serialPort1.IsOpen)
- {
- try
- {
- serialPort1.PortName = cb_com.Text;
- serialPort1.BaudRate = Convert.ToInt32(cb_Baud.Text);
- serialPort1.DataBits = Convert.ToInt32(cb_DataBits.Text);
- serialPort1.StopBits = (StopBits)Convert.ToInt32(cb_StopBits.Text);
- serialPort1.Open();
- }
- catch
- {
- MessageBox.Show("端口打开失败", "错误");
- }
- }
- else {
- try
- {
- serialPort1.Close();
- }
- catch
- {
- MessageBox.Show("端口关闭失败", "错误");
- }
- }
- changeButtonTextAndPicture();
- }
- #endregion
- #region 根据串口状态切换按键名称和指示灯图片
- private void changeButtonTextAndPicture()
- {
- if (serialPort1.IsOpen)
- {
- pictureBox1.Image = Properties.Resources.on;
- button1.Text = "关闭串口";
- }
- else
- {
- pictureBox1.Image = Properties.Resources.off;
- button1.Text = "打开串口";
- }
- }
- #endregion
- #region 多行发送
- private void button2_Click(object sender, EventArgs e)
- {
- byte[] Data = new byte[];
- if (serialPort1.IsOpen)
- {
- if(textBox_send1.Text != "")
- {
- if(!checkBox_sendMode.Checked)//发送模式是字符模式
- {
- try
- {
- serialPort1.Write(textBox_send1.Text);
- }
- catch
- {
- MessageBox.Show("端口发送失败,系统将关闭当前串口", "错误");
- serialPort1.Close();//关闭串口
- }
- }
- else
- {
- if(textBox_send1.Text.Length% == )//偶数个数字
- {
- for(int i = ; i < textBox_send1.Text.Length / ; i++)
- {
- try
- {
- Data[] = Convert.ToByte(textBox_send1.Text.Substring(i * , ), );
- }
- catch
- {
- MessageBox.Show("请核对输入的十六进制数据格式", "错误");
- }
- try
- {
- serialPort1.Write(Data, , );
- }
- catch
- {
- MessageBox.Show("端口发送失败,系统将关闭当前串口", "错误");
- serialPort1.Close();//关闭串口
- }
- }
- }
- else
- {
- MessageBox.Show("请输入偶数个16进制数字", "错误");
- }
- }
- }
- }
- }
- #endregion
- #region 单行发送
- private void button3_Click(object sender, EventArgs e)
- {
- byte[] Data = new byte[];
- if (serialPort1.IsOpen)
- {
- if (textBox_send2.Text != "")
- {
- if (!checkBox_sendMode.Checked)//发送模式是字符模式
- {
- try
- {
- serialPort1.Write(textBox_send2.Text);
- if (checkBox_newLine.Checked)
- serialPort1.Write("\r\n");
- }
- catch
- {
- MessageBox.Show("端口发送失败,系统将关闭当前串口", "错误");
- serialPort1.Close();//关闭串口
- }
- }
- else
- {
- if (textBox_send2.Text.Length % == )//偶数个数字
- {
- for (int i = ; i < textBox_send2.Text.Length / ; i++)
- {
- try
- {
- Data[] = Convert.ToByte(textBox_send2.Text.Substring(i * , ), );
- }
- catch
- {
- MessageBox.Show("请核对输入的十六进制数据格式", "错误");
- }
- try
- {
- serialPort1.Write(Data, , );
- if (checkBox_newLine.Checked)
- serialPort1.Write("\r\n");
- }
- catch
- {
- MessageBox.Show("端口发送失败,系统将关闭当前串口", "错误");
- serialPort1.Close();//关闭串口
- }
- }
- }
- else
- {
- MessageBox.Show("请输入偶数个16进制数字", "错误");
- }
- }
- }
- }
- }
- #endregion
- #region 切换选项时候修改串口属性
- private void cb_com_SelectedIndexChanged(object sender, EventArgs e)
- {
- try
- {
- if (serialPort1.IsOpen)
- {
- serialPort1.Close();
- serialPort1.PortName = cb_com.Text;
- serialPort1.Open();
- }
- else
- {
- serialPort1.PortName = cb_com.Text;
- }
- }
- catch (System.Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- finally
- {
- changeButtonTextAndPicture();
- }
- }
- private void cb_Baud_SelectedIndexChanged(object sender, EventArgs e)
- {
- serialPort1.BaudRate = int.Parse(cb_Baud.Text);
- }
- private void cb_DataBits_SelectedIndexChanged(object sender, EventArgs e)
- {
- serialPort1.DataBits = int.Parse(cb_DataBits.Text);
- }
- private void cb_StopBits_SelectedIndexChanged(object sender, EventArgs e)
- {
- serialPort1.StopBits = (StopBits)int.Parse(cb_StopBits.Text);
- }
- #endregion
- #region com的下拉菜单展开时候自动搜索当前设备管理器
- private void cb_com_DropDown(object sender, EventArgs e)
- {
- cb_com.Items.Clear(); //清空
- //查询当前有用的串口号
- SerialPort.GetPortNames();
- string[] ports = SerialPort.GetPortNames();
- foreach (string port in ports)
- {
- cb_com.Items.Add(port);
- }
- }
- #endregion
- }
- }
工程源码下载(使用VS2015编译):
http://yunpan.cn/cHLTVtXLL6UYs 访问密码 bf4e
C# 串口调试助手源码的更多相关文章
- 串口调试助手---VB源码
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- 网狐6603 cocos2dx 棋牌、捕鱼、休闲类游戏《李逵捕鱼》手机端完整源码分析及分享
该资源说明: cocos2d 棋牌.捕鱼.休闲类游戏<李逵捕鱼>手机端完整源码,网狐6603配套手机版源码,可以选桌子,适合新手学习参考,小编已亲测试,绝对完整可编译手机端,下载后将文件考 ...
- 实现简单的手写涂鸦板(demo源码)
在一些软件系统中,需要用到手写涂鸦的功能,然后可以将涂鸦的结果保存为图片,并可以将"真迹"通过网络发送给对方.这种手写涂鸦功能是如何实现的了?最直接的,我们可以使用Windows提 ...
- 源码来袭:bind手写实现
JavaScript中的this指向规则 源码来袭:call.apply手写实现与应用 理解建议:如果对this指向规则不了解的话,建议先了解this指向规则,最好还能对call和apply的使用和内 ...
- JGUI源码:Accordion鼠标中键滚动和手机端滑动实现(2)
本文是抽屉组件在PC端滚动鼠标中键.手机端滑动时,滚动数据列表实现方法,没有使用iscroll等第三方插件,支持火狐,谷歌,IE8+等浏览器. 演示在:www.jgui.com Github地址:ht ...
- 框架源码系列四:手写Spring-配置(为什么要提供配置的方法、选择什么样的配置方式、配置方式的工作过程是怎样的、分步骤一个一个的去分析和设计)
一.为什么要提供配置的方法 经过前面的手写Spring IOC.手写Spring DI.手写Spring AOP,我们知道要创建一个bean对象,需要用户先定义好bean,然后注册到bean工厂才能创 ...
- 手机端页面自适应解决方案—rem布局(进阶版,附源码示例)
转自:https://segmentfault.com/a/1190000007350680 一年前笔者写了一篇 <手机端页面自适应解决方案—rem布局>,意外受到很多朋友的关注和喜欢.但 ...
- 某Android手游的lua源码逆向分析与还原
近日分析某一款Android上面的手游,反编译后再起asset目录下可以看到加密过的脚本,lib目录下发现lua的so 初步怀疑其使用lua脚本实现的 解密函数定位 动态跟踪解密函数流程 静态分析解密 ...
- arcgis api 4.x for js 自定义 Draw 绘制手绘面以及手绘线,只针对二维视图(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...
随机推荐
- Android学习(五) 圆角实现(转)
设置边框圆角可以在drawable-mdpi目录里定义一个取名为corners_bg.xml <?xml version="1.0" encoding="utf-8 ...
- 字典树-HDOJ-1247-Hat’s Words
Hat's Words Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- mysql kill process解决死锁
mysql使用myisam的时候锁表比较多,尤其有慢查询的时候,造成死锁.这时需要手动kill掉locked的process.使他释放. (以前我都是重起服务)..惭愧啊.. 演示:(id 7是我用p ...
- 使用ByteRef加速String类型DocValues的载入
眼下商户索引DocValues很大,warmup时花费70-80秒(在beta环境),有62秒在载入DocValues,发现当中有54秒时间在载入string docvalues,string doc ...
- (九)Thymeleaf用法——Themeleaf注释
4. 注释 模板名称:comment.html 4.1 标准 HTML/XML注释 语法:<!-- --> 4.2 解析器级注释块(Parser-level ...
- 【SpringMVC学习09】SpringMVC与前台的json数据交互
json数据格式在接口调用中.html页面中比较常用,json格式比较简单,解析也比较方便,所以使用很普遍.在springmvc中,也支持对json数据的解析和转换,这篇文章主要总结一下springm ...
- hector_localization hector_salm rplidar同时编译
1.将hector_localization包clone到src文件夹 进行功能包依赖安装 cd test_ws rosdep update rosdep install --from-paths ...
- SQL 根据表获取字段字符串
SQLSERVER查询单个数据表所有字段名组合成的字符串脚本 --SQLSERVER查询单个数据表所有字段名组合成的字符串脚本 --应用场合: 用于生成SQL查询字符串中select 字段名列表1 f ...
- Webpack与Gulp、Grunt区别
Webpack与Gulp.Grunt没有什么可比性,它可以看作模块打包机,通过分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等 ...
- iOS collectionView添加类似tableView的tableHeaderView
我们都知道UITableview有一个tableHeaderFooterView,这样我们在布局页面的时候,如果顶部有轮播图,可以直接把轮播图设置为tableView的HeaderFooterView ...