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

基本功能:

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. SQL语句练习手册--第三篇

    一.CASE的两种用法 1.1 等值判断->相当于switch case (1)具体用法模板: CASE expression WHEN value1 THEN returnvalue1 WHE ...

  2. perftools查看堆外内存并解决hbase内存溢出

    最近线上运行的hbase发现分配了16g内存,但是实际使用了22g,堆外内存达到6g.感觉非常诡异.堆外内存用一般的工具很难查看,可以通过google-perftools来跟踪: http://cod ...

  3. redmine安装笔记

    切换到redmine安装目录 对所有ip开放启动命令,并且注册为后台运行 nohup ruby bin/rails server webrick -e production -b 0.0.0.0 -p ...

  4. [转]Tomcat处理一个HTTP请求的过程

    1.Tomcat Server的组成部分 1.1 - Server A Server element represents the entire Catalina servlet container. ...

  5. asp.net core mvc视频A:笔记2-1.控制器定义

    方式一:以Controller结尾 方式二:不以Controller结尾 思考 默认路由规则为 运行示例(这里不需要写testcontroller,只写test就可以了) 同理测试test类中的控制器 ...

  6. 利用$(window).resize()实现窗口大小自适应宽度问题

    © 版权声明:本文为博主原创文章,转载请注明出处 问题描述:利用iframe做页面引入,用$(window).resize()作自适应:结果窗口变小时,利用$(window).width()获取到的宽 ...

  7. Atitit. Object-c语言 的新的特性  attilax总结

    Atitit. Object-c语言 的新的特性  attilax总结 1.1. Object-C语言由 Brad J.Cox于20世纪80年代早期设计,1 1.2. Object-C新增的数据结构: ...

  8. Spring 中的Null-Safety

    之前一直在某些代码中看到过使用@Nullable 标注过的注释,当时也没有在意到底是什么意思,所以这篇文章来谈谈Spring中关于Null的那些事. 在Java中不允许让你使用类型表示其null的安全 ...

  9. find 多文件查找需要单引号

    [root@db01 local]# find  -name '*.com'|xargs egrep "qq"./tt.com:qq[root@db01 local]# find  ...

  10. 为什么Goroutine能有上百万个,Java线程却只能有上千个?

      作者|Russell Cohen   译者|张卫滨   本文通过 Java 和 Golang 在底层原理上的差异,分析了 Java 为什么只能创建数千个线程,而 Golang 可以有数百万的 Go ...