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 各个类 ...
随机推荐
- 用二十秒记住几个PHP基础知识点
数组: 索引数组:数组的键是整数的数组,从0開始. 关联数组:数组的键是字符串的数组 //索引数组 $arr=array('I','love','you'); //关联数组 $arr0=array(' ...
- android dp 和 px 的相互转换
在开发中,可能须要动态设置控件的大小 比如为一个gridview设置宽度: LinearLayout.LayoutParams linearParams2 = (LinearLayout.Layout ...
- redis 的安装与启动
1.redis介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. Redis 是一个高性能的key-val ...
- SpringCloud系列一:微服务理解
1. 单体架构 一个归档包(例如war格式)包含所有功能的应用程序,通常称为单体应用. > 复杂性高:模块多,模块的边界模糊,依赖关系不清楚,代码质量参差不齐. > 技术债务:随着时间推移 ...
- Angular 资料大集合
https://angular.cn/ Angular 的中文网 http://www.apjs.net/#dir1 Angular 的中文网 http://www.ngnice.com/ ...
- idea设置自定义快捷键
在说明之前,先引入一个非常好的 Intellij Idea中文教程:intelliJ Idea中文教程 一创建模板类 二使用方法备注 在IntellijIdea中我并没有找到直接对某个方法进行注释的模 ...
- Android Camera子系统之源码View
本文基于Android 4.2.2+Linux3.6.9+SAMA5D3 SoC从源码的角度审视Android Camera子系统. 应用层 Androd原生Camera应用 /system/app/ ...
- Apache + Tomcat集群 + 负载均衡
Part I: 取经处: http://www.ramkitech.com/2012/10/tomcat-clustering-series-simple-load.html http://blog ...
- dedecms织梦如何调用指定的多个栏目导航
{dede:channelartlist row='2' typeid='1,2这里输入多个指定的栏目ID' } <li><a href='{dede:field name='typ ...
- ios 动画 创建一个UIImageView并将其属性设置animationImages为UIImages 的数组
NSArray *animationFrames = [NSArray arrayWithObjects: [UIImage imageWithName:@"image1.png" ...