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 各个类 ...
随机推荐
- go语言25个关键字总结
var和const :变量和常量的声明var varName type 或者 varName : = valuepackage and import: 导入func: 用于定义函数和方法return ...
- NodeJS中的循环陷阱
Node.js的异步机制由事件和回调函数实现,一開始接触可能会感觉违反常规,但习惯以后就会发现还是非常easy的. 然而这之中事实上暗藏不少陷阱.一个非常easy遇到的问题就是回到循环的回调函数. e ...
- UIWebView 加载网页、文件、 html
UIWebView 是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf word doc 等等文件 生成webview 有两种方法,1.通过storyboard 拖拽 2.通过al ...
- MQTT--入门
一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议 ...
- java游戏开发之基础
© 版权声明:本文为博主原创文章,转载请注明出处 游戏图形界面开发基础 AWT:(Abstract Window Toolkit,抽象窗口工具集) AWT中包含图形界面编程的基本类库,是Java语言G ...
- bzoj 2458: [BeiJing2011]最小三角形 题解
[前言]话说好久没有写题解了.到暑假了反而忙.o(╯□╰)o [原题] 2458: [BeiJing2011]最小三角形 Time Limit: 10 Sec Memory Limit: 128 M ...
- lua学习笔记(三)
类型与值 lua是一种动态类型的语言,在语言中没有类型定义的语法,每个值都携带了它自身的类型信息 lua中有8种基础类型 nil 只与自身相等assert(nil==nil ...
- spring 事件驱动模型简介
事件驱动模型简介 事件驱动模型也就是我们常说的观察者,或者发布-订阅模型:理解它的几个关键点: 首先是一种对象间的一对多的关系:最简单的如交通信号灯,信号灯是目标(一方),行人注视着信号灯(多方): ...
- nginx 查看接口请求时间 每个请求图片的时间或者文件的
根据nginx的access_log查看接口请求时间 muyuren 发表于 1年前 阅读 2300 收藏 0 推荐 0 评论 0 推荐 收藏 首先修改修改生成日志的格式,在nginx配置文件的htt ...
- laravel学习之路2: jwt集成
"tymon/jwt-auth": "^1.0@dev", 执行 composer update 'providers' => [ .... Tymon\ ...