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

基本功能:

1.点串口号的下拉菜单自动当前检索设备管理器的COM

2.发送模式可选,hex和string两种

3.接收显示模式,hex和string两种

4.发送多行数据

5.发送单行,可增加自动换行(方便用于一些串口指令,很多指令都带回车,每次写回车太麻烦)

效果演示:

主代码参考:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.IO.Ports;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Windows.Forms;
  10.  
  11. namespace SerialTools
  12. {
  13. public partial class Form1 : Form
  14. {
  15. private long RxCount = ;
  16. public Form1()
  17. {
  18. InitializeComponent();
  19. System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
  20. }
  21.  
  22. #region 初始化Form
  23. private void Form1_Load(object sender, EventArgs e)
  24. {
  25. pictureBox1.Image = Properties.Resources.off;
  26.  
  27. ////查询当前有用的串口号
  28. //SerialPort.GetPortNames();
  29.  
  30. //string[] ports = SerialPort.GetPortNames();
  31. //foreach (string port in ports)
  32. //{
  33. // cb_com.Items.Add(port);
  34. //}
  35.  
  36. serialPort1.BaudRate = ;
  37. serialPort1.DataBits = ;
  38. serialPort1.StopBits = (StopBits);
  39.  
  40. //迭代所有的波特率
  41. string[] tab_Baud = new string[] { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" };
  42. foreach (string str in tab_Baud)
  43. {
  44. cb_Baud.Items.Add(str);
  45. }
  46.  
  47. //迭代所有的数据位
  48. string[] tab_data = new string[] { "", "", "", "" };
  49. foreach (string str in tab_data)
  50. {
  51. cb_DataBits.Items.Add(str);
  52. }
  53.  
  54. //迭代所有的停止位
  55. string[] tab_stop = new string[] { "", "" };
  56. foreach (string str in tab_stop)
  57. {
  58. cb_StopBits.Items.Add(str);
  59. }
  60.  
  61. cb_Baud.Text = "";
  62. cb_DataBits.Text = "";
  63. cb_StopBits.Text = "";
  64.  
  65. serialPort1.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);//添加事件
  66.  
  67. }
  68. #endregion
  69.  
  70. #region 接收数据
  71. private void port_DataReceived(object sender,SerialDataReceivedEventArgs e) {
  72. if (!checkBox_receiveMode.Checked)//没有勾选hex时候,按照字符串方式读取
  73. {
  74. string str = serialPort1.ReadExisting();//字符串方式读
  75. textBox_receive.AppendText(str); //添加内容
  76. RxCount += str.Length;
  77.  
  78. }
  79. else {
  80. byte data;
  81. data = (byte)serialPort1.ReadByte();
  82. string str = Convert.ToString(data, ).ToUpper();
  83. textBox_receive.AppendText((str.Length == ? "" + str : str)+" ");//空位补"0"
  84. RxCount += str.Length;
  85. }
  86. label_ReceiveCount.Text = RxCount.ToString();
  87. }
  88. #endregion
  89.  
  90. #region 清空接收计数器和接收显示区域
  91. private void button4_Click(object sender, EventArgs e)
  92. {
  93. textBox_receive.Text = "";
  94. RxCount = ;
  95. label_ReceiveCount.Text = RxCount.ToString();
  96. }
  97. #endregion
  98.  
  99. #region 打开/关闭串口
  100. private void button1_Click(object sender, EventArgs e)
  101. {
  102. if (!serialPort1.IsOpen)
  103. {
  104. try
  105. {
  106. serialPort1.PortName = cb_com.Text;
  107. serialPort1.BaudRate = Convert.ToInt32(cb_Baud.Text);
  108. serialPort1.DataBits = Convert.ToInt32(cb_DataBits.Text);
  109. serialPort1.StopBits = (StopBits)Convert.ToInt32(cb_StopBits.Text);
  110. serialPort1.Open();
  111. }
  112. catch
  113. {
  114. MessageBox.Show("端口打开失败", "错误");
  115.  
  116. }
  117. }
  118. else {
  119. try
  120. {
  121. serialPort1.Close();
  122. }
  123. catch
  124. {
  125. MessageBox.Show("端口关闭失败", "错误");
  126.  
  127. }
  128. }
  129.  
  130. changeButtonTextAndPicture();
  131.  
  132. }
  133. #endregion
  134.  
  135. #region 根据串口状态切换按键名称和指示灯图片
  136. private void changeButtonTextAndPicture()
  137. {
  138. if (serialPort1.IsOpen)
  139. {
  140. pictureBox1.Image = Properties.Resources.on;
  141. button1.Text = "关闭串口";
  142. }
  143. else
  144. {
  145. pictureBox1.Image = Properties.Resources.off;
  146. button1.Text = "打开串口";
  147. }
  148. }
  149. #endregion
  150.  
  151. #region 多行发送
  152. private void button2_Click(object sender, EventArgs e)
  153. {
  154. byte[] Data = new byte[];
  155. if (serialPort1.IsOpen)
  156. {
  157. if(textBox_send1.Text != "")
  158. {
  159. if(!checkBox_sendMode.Checked)//发送模式是字符模式
  160. {
  161. try
  162. {
  163. serialPort1.Write(textBox_send1.Text);
  164. }
  165. catch
  166. {
  167. MessageBox.Show("端口发送失败,系统将关闭当前串口", "错误");
  168. serialPort1.Close();//关闭串口
  169. }
  170. }
  171. else
  172. {
  173. if(textBox_send1.Text.Length% == )//偶数个数字
  174. {
  175. for(int i = ; i < textBox_send1.Text.Length / ; i++)
  176. {
  177. try
  178. {
  179. Data[] = Convert.ToByte(textBox_send1.Text.Substring(i * , ), );
  180. }
  181. catch
  182. {
  183. MessageBox.Show("请核对输入的十六进制数据格式", "错误");
  184.  
  185. }
  186.  
  187. try
  188. {
  189. serialPort1.Write(Data, , );
  190. }
  191. catch
  192. {
  193. MessageBox.Show("端口发送失败,系统将关闭当前串口", "错误");
  194. serialPort1.Close();//关闭串口
  195. }
  196. }
  197. }
  198. else
  199. {
  200. MessageBox.Show("请输入偶数个16进制数字", "错误");
  201. }
  202. }
  203. }
  204. }
  205. }
  206. #endregion
  207.  
  208. #region 单行发送
  209. private void button3_Click(object sender, EventArgs e)
  210. {
  211. byte[] Data = new byte[];
  212. if (serialPort1.IsOpen)
  213. {
  214. if (textBox_send2.Text != "")
  215. {
  216. if (!checkBox_sendMode.Checked)//发送模式是字符模式
  217. {
  218. try
  219. {
  220. serialPort1.Write(textBox_send2.Text);
  221. if (checkBox_newLine.Checked)
  222. serialPort1.Write("\r\n");
  223. }
  224. catch
  225. {
  226. MessageBox.Show("端口发送失败,系统将关闭当前串口", "错误");
  227. serialPort1.Close();//关闭串口
  228. }
  229. }
  230. else
  231. {
  232. if (textBox_send2.Text.Length % == )//偶数个数字
  233. {
  234. for (int i = ; i < textBox_send2.Text.Length / ; i++)
  235. {
  236. try
  237. {
  238. Data[] = Convert.ToByte(textBox_send2.Text.Substring(i * , ), );
  239. }
  240. catch
  241. {
  242. MessageBox.Show("请核对输入的十六进制数据格式", "错误");
  243.  
  244. }
  245.  
  246. try
  247. {
  248. serialPort1.Write(Data, , );
  249. if (checkBox_newLine.Checked)
  250. serialPort1.Write("\r\n");
  251.  
  252. }
  253. catch
  254. {
  255. MessageBox.Show("端口发送失败,系统将关闭当前串口", "错误");
  256. serialPort1.Close();//关闭串口
  257. }
  258. }
  259. }
  260. else
  261. {
  262. MessageBox.Show("请输入偶数个16进制数字", "错误");
  263. }
  264. }
  265. }
  266. }
  267. }
  268. #endregion
  269.  
  270. #region 切换选项时候修改串口属性
  271. private void cb_com_SelectedIndexChanged(object sender, EventArgs e)
  272. {
  273. try
  274. {
  275. if (serialPort1.IsOpen)
  276. {
  277. serialPort1.Close();
  278. serialPort1.PortName = cb_com.Text;
  279. serialPort1.Open();
  280. }
  281. else
  282. {
  283. serialPort1.PortName = cb_com.Text;
  284. }
  285. }
  286. catch (System.Exception ex)
  287. {
  288. MessageBox.Show(ex.Message);
  289. }
  290. finally
  291. {
  292. changeButtonTextAndPicture();
  293. }
  294. }
  295.  
  296. private void cb_Baud_SelectedIndexChanged(object sender, EventArgs e)
  297. {
  298. serialPort1.BaudRate = int.Parse(cb_Baud.Text);
  299. }
  300.  
  301. private void cb_DataBits_SelectedIndexChanged(object sender, EventArgs e)
  302. {
  303. serialPort1.DataBits = int.Parse(cb_DataBits.Text);
  304. }
  305.  
  306. private void cb_StopBits_SelectedIndexChanged(object sender, EventArgs e)
  307. {
  308. serialPort1.StopBits = (StopBits)int.Parse(cb_StopBits.Text);
  309. }
  310. #endregion
  311.  
  312. #region com的下拉菜单展开时候自动搜索当前设备管理器
  313. private void cb_com_DropDown(object sender, EventArgs e)
  314. {
  315. cb_com.Items.Clear(); //清空
  316. //查询当前有用的串口号
  317. SerialPort.GetPortNames();
  318.  
  319. string[] ports = SerialPort.GetPortNames();
  320. foreach (string port in ports)
  321. {
  322. cb_com.Items.Add(port);
  323. }
  324. }
  325. #endregion
  326. }
  327. }

工程源码下载(使用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. Android学习(五) 圆角实现(转)

    设置边框圆角可以在drawable-mdpi目录里定义一个取名为corners_bg.xml <?xml version="1.0" encoding="utf-8 ...

  2. 字典树-HDOJ-1247-Hat’s Words

    Hat's Words Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  3. mysql kill process解决死锁

    mysql使用myisam的时候锁表比较多,尤其有慢查询的时候,造成死锁.这时需要手动kill掉locked的process.使他释放. (以前我都是重起服务)..惭愧啊.. 演示:(id 7是我用p ...

  4. 使用ByteRef加速String类型DocValues的载入

    眼下商户索引DocValues很大,warmup时花费70-80秒(在beta环境),有62秒在载入DocValues,发现当中有54秒时间在载入string docvalues,string doc ...

  5. (九)Thymeleaf用法——Themeleaf注释

    4. 注释 模板名称:comment.html 4.1 标准 HTML/XML注释       语法:<!--     -->      4.2 解析器级注释块(Parser-level ...

  6. 【SpringMVC学习09】SpringMVC与前台的json数据交互

    json数据格式在接口调用中.html页面中比较常用,json格式比较简单,解析也比较方便,所以使用很普遍.在springmvc中,也支持对json数据的解析和转换,这篇文章主要总结一下springm ...

  7. hector_localization hector_salm rplidar同时编译

    1.将hector_localization包clone到src文件夹  进行功能包依赖安装 cd test_ws rosdep update rosdep install --from-paths ...

  8. SQL 根据表获取字段字符串

    SQLSERVER查询单个数据表所有字段名组合成的字符串脚本 --SQLSERVER查询单个数据表所有字段名组合成的字符串脚本 --应用场合: 用于生成SQL查询字符串中select 字段名列表1 f ...

  9. Webpack与Gulp、Grunt区别

    Webpack与Gulp.Grunt没有什么可比性,它可以看作模块打包机,通过分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等 ...

  10. iOS collectionView添加类似tableView的tableHeaderView

    我们都知道UITableview有一个tableHeaderFooterView,这样我们在布局页面的时候,如果顶部有轮播图,可以直接把轮播图设置为tableView的HeaderFooterView ...