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 各个类 ...
随机推荐
- Oracle dos连接数据库基本操作
sqlplus / as sysdba;(sqlplus 用户名/密码@ip:端口:数据库实例 as sysdba;) ;(设置显示多少列,pagesize:;每页多少记录) select * fro ...
- oracle字符串处理函数
1.LOWER(string) 将输入的字符串转换成小写: 2.UPPER(string) 将输入的字符串转换成大写: 3.INITCAP(string) 将输入的字符串单词的首字母转换成大写(如果不 ...
- js从$scope外部调用$scope内部函数,跨js调用非全局函数
scope内部函数定义 //定位 $scope.LocateByPoint = function (x,y) { if(!x || !y) { window.alert("GPS坐标不存在, ...
- leetCode 15. 3Sum (3数之和) 解题思路和方法
3Sum Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find ...
- Python script to create Screen from all Items/Graphs of a host
#!/usr/bin/env python import urllib2 import json import argparse def authenticate(url, username, pas ...
- Mac下安装LNMP(Nginx+PHP5.6)环境(转)
安装Homebrew 最近工作环境切换到Mac,所以以OS X Yosemite(10.10.1)为例,记录一下从零开始安装Mac下LNMP环境的过程 确保系统已经安装xcode,然后使用一行命令安装 ...
- Atitit.面向接口的web 原理与设计重写 路由启动绑定配置url router rewriting urlpage mvc mvp的 java c#.net php js
Atitit.面向接口的web 原理与设计重写 路由启动绑定配置url router rewriting urlpage mvc mvp的 java c#.net php js 原理 通过vm带入启 ...
- nodeJS 中关于 promise 的使用
var readInfo = function (fileName) { var defer = q.defer(); fs.readFile(fileName, {encoding:'utf-8'} ...
- 挑战--asp.net 文件夹上传
今天遇到一个有趣的问题,公司让平安做一个上传文件夹的功能,这个任务具有一定的挑战性哦.上传文件夹,我第一次看到有人这样做,以前都是上传压缩文件,从来就没有见人上传过文件夹,我也从来就没有尝试过.先不讨 ...
- centos6.9使用NTFS-3G挂载ntfs文件系统
centos6.9使用NTFS-3G挂载ntfs文件系统 工作中,难免需要到linux 系统上拷贝文件,但linux 自己不支持ntfs,下面就是解决问题的办法. NTFS-3G是一个开源软件,支持在 ...