本方法,禁用跨进程错误(做法不太好,但是对于单片机出身的人来说,好理解,能用就行)。

基本功能:

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# 串口调试助手源码的更多相关文章

  1. 串口调试助手---VB源码

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  2. 网狐6603 cocos2dx 棋牌、捕鱼、休闲类游戏《李逵捕鱼》手机端完整源码分析及分享

    该资源说明: cocos2d 棋牌.捕鱼.休闲类游戏<李逵捕鱼>手机端完整源码,网狐6603配套手机版源码,可以选桌子,适合新手学习参考,小编已亲测试,绝对完整可编译手机端,下载后将文件考 ...

  3. 实现简单的手写涂鸦板(demo源码)

    在一些软件系统中,需要用到手写涂鸦的功能,然后可以将涂鸦的结果保存为图片,并可以将"真迹"通过网络发送给对方.这种手写涂鸦功能是如何实现的了?最直接的,我们可以使用Windows提 ...

  4. 源码来袭:bind手写实现

    JavaScript中的this指向规则 源码来袭:call.apply手写实现与应用 理解建议:如果对this指向规则不了解的话,建议先了解this指向规则,最好还能对call和apply的使用和内 ...

  5. JGUI源码:Accordion鼠标中键滚动和手机端滑动实现(2)

    本文是抽屉组件在PC端滚动鼠标中键.手机端滑动时,滚动数据列表实现方法,没有使用iscroll等第三方插件,支持火狐,谷歌,IE8+等浏览器. 演示在:www.jgui.com Github地址:ht ...

  6. 框架源码系列四:手写Spring-配置(为什么要提供配置的方法、选择什么样的配置方式、配置方式的工作过程是怎样的、分步骤一个一个的去分析和设计)

    一.为什么要提供配置的方法 经过前面的手写Spring IOC.手写Spring DI.手写Spring AOP,我们知道要创建一个bean对象,需要用户先定义好bean,然后注册到bean工厂才能创 ...

  7. 手机端页面自适应解决方案—rem布局(进阶版,附源码示例)

    转自:https://segmentfault.com/a/1190000007350680 一年前笔者写了一篇 <手机端页面自适应解决方案—rem布局>,意外受到很多朋友的关注和喜欢.但 ...

  8. 某Android手游的lua源码逆向分析与还原

    近日分析某一款Android上面的手游,反编译后再起asset目录下可以看到加密过的脚本,lib目录下发现lua的so 初步怀疑其使用lua脚本实现的 解密函数定位 动态跟踪解密函数流程 静态分析解密 ...

  9. arcgis api 4.x for js 自定义 Draw 绘制手绘面以及手绘线,只针对二维视图(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 4.x for js:esri 官网 api,里面详细的介绍 arcgis api 4.x 各个类 ...

随机推荐

  1. 【读书笔记】【深入理解ES6】#1-块级作用域绑定

    var声明及变量提升(Hoisting)机制 在函数作用域或全局作用域中通过var关键字声明的变量,无论实际上是在哪里声明的,都会被当成在当前作用域顶部声明的变量.这就是我们常说的提升(Hoistin ...

  2. 使用PostMan快速生成代码

    Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件.关于PostMan的下载和使用网上有很多相关的博客介绍,本文主要介绍PostMan在进行模拟Http请求后可以根据需要的 ...

  3. Atitit.go语言golang语言的新的特性  attilax总结

    Atitit.go语言golang语言的新的特性  attilax总结 1. 继承树less  动态接口1 1.1. 按照书中说的,Go语言具有以下的特征,下面我们分别来进行介绍.  q 自动垃圾回收 ...

  4. python socket编程(socket)

    代码如下: server端: import sockets=socket.socket(socket.AF_INET,socket.SOCK_STREAM)host=socket.gethostnam ...

  5. spring boot 集成mybatis报错

    Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of ...

  6. centos7 配置ssh 免密码登陆

    我只有一台机器,是因为要配置hadoop分布式环境用,需要配置ssh 两个用户: zhangxs, root 首先在切换到zhangxs用户下 执行[ ssh-keygen -t rsa] [zhan ...

  7. java多线程之happens-before

    1.背景问题 在讲happens-before之前,先引入一个例子: 假定我们有已经被初始化的变量: int counter = 0; 这个 counter 变量被两个线程所共有,也就是说线程A和线程 ...

  8. Google Code Jam 2014 资格赛:Problem C. Minesweeper Master

    Problem Minesweeper is a computer game that became popular in the 1980s, and is still included in so ...

  9. Nginx 变量漫谈

    转自:http://blog.sina.com.cn/openrestyNginx 的配置文件使用的就是一门微型的编程语言,许多真实世界里的 Nginx 配置文件其实就是一个一个的小程序.当然,是不是 ...

  10. Servlet和JSP中的过滤器都是Java类

    JSP 过滤器 Servlet和JSP中的过滤器都是Java类,它们存在的目的如下: 在请求访问后端资源时拦截它 管理从服务器返回给客户端的响应 下面列出了多种常用的过滤器类型: 认证过滤器 数据压缩 ...