在学校里的团队里,遇到需要与下位机实现串口通信的项目,假期里查了很多资料,在此发一篇加深一下印象

需要:
电脑,vs软件(visual studio 2010)
Serial Port Tester(串口调试工具)
友善串口调试助手(选择添加COM1和COM2)


第一步
打开文件,新建,项目

选择Windows窗体应用程序,随意命名
点击视图,选择工具箱(找到button,和serialport,拖动到窗体上)

鼠标右键点击serialport,查看属性,默认值不改变(可以自己更改,选择可用串口);再双击button1进入

在button1点击事件中写简单代码,调试运行,再打开串口助手选择asc2接收(注意,虚拟串口成对出现,这里是COM1和COM2,且目前只能发送一次,多点会出错,后面用try catch 解决)

serialport1.Open();
string str ="easy";
serialport1.write(str);

第二步
退出运行后,继续添加控件,并在属性栏中修改控件名称和控件显示的文本(如将button1改为buttonOpen)

再修改代码,使可以关闭串口,和将文本框的字符发送的功能

第三步
添加接收文本框,修改名称后将属性设置为多行,垂直滚动

双击进入serialport属性里的datareceive事件

在datareceived事件里编写代码,遇到跨线程错误后,在Form1里加入一句代码,使不进行跨线程检查

string str =serialport1.ReadExisisting();
textBoxReceive.AppendText(str);


在form1里添加代码后,用串口助手发送asc2数据,接收文本框显示接收到的数据(还不能发汉字)

 public Form1(){InitializeComponent();//防止跨线程错误System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;     }


到现在的,基本的发送接收已经完成了,但是可能会出现很多问题,比如说:串口可能多次打开会出错,无法发送和接收文字,无法像助手一样选择发送接收模式…所以继续优化,问题慢慢解决
第四步
添加串口,波特率下拉框,并编辑内容

添加panel容器并往容器上加单选框,更改属性名称和文本

再在打开按钮上加上try catch 语句,避免运行过程中死机,在form1load再给控件初始化

private void Form1_Load(object sender, EventArgs e){radioButtonReceiveHex.Checked = true;         //接收单选框默认值为HexradioButtonSendHex.Checked = true;            //发送单选框默认值为HexcomboBox1.Text = "COM1";                      //默认值comboBox2.Text = "9600";}

再对发送和接收事件进行优化,可选择Asc2和Hex模式(代码在最后)


再在form1中改变串口接送的编码,实现汉字转化

   serialPort1.Encoding = Encoding.GetEncoding("GB2312");


此时的程序与下位机匹配时,即可实现简单的数据通讯了
本次的完整代码如下
*Form1

 public Form1(){InitializeComponent();//串口接收编码   serialPort1.Encoding = Encoding.GetEncoding("GB2312");                         //防止跨线程错误System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;     }

Form1_Load

private void Form1_Load(object sender, EventArgs e){radioButtonReceiveHex.Checked = true;         //默认值为HexradioButtonSendHex.Checked = true;            //默认值为HexcomboBox1.Text = "COM1";                      //默认值comboBox2.Text = "9600";}

打开按钮事件

private void buttonOpen_Click(object sender, EventArgs e){if (buttonOpen.Text == "打开串口")//判断文字{try                                                              //尝试以下代码,未能完全执行就执行catch {serialPort1.PortName = comboBox1.Text;                    //将串口文本框的COM值传给serialportserialPort1.BaudRate = Convert.ToInt16(comboBox2.Text);   //j将波特率文本框的值转成数字给serialportserialPort1.Close();                                        //关闭串口serialPort1.Open();                                       //打开串口,若未打开,则不往下执行   buttonOpen.Text = "关闭串口";                           //将按钮文本"打开串口"改为"关闭串口"}catch (Exception err){MessageBox.Show(err.ToString(), "错误");//弹出消息提示}}else{serialPort1.Close();                         //关闭串口buttonOpen.Text = "打开串口";               //将按钮文本"关闭串口"改为"打开串口"}}

串口接收事件

 private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e){if (radioButtonReceiveAsc2.Checked)                             //如果接收模式为字符模式{string str = serialPort1.ReadExisting();                    //字符串方式读textBoxReceive.AppendText(str);                             //将接收文本添加到文本框中}else                                                            //如果接收模式为数值接收{ byte data;data = (byte)serialPort1.ReadByte();                      //此处需要强制类型转换,将(int)类型数据转换为(byte类型数据,不必考虑是否会丢失数据string str = Convert.ToString(data, 16).ToUpper();        //转换为大写十六进制字符串textBoxReceive.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");//空位补“0”   //上一句等同为:if(str.Length == 1)//                  str = "0" + str; //              else //                  str = str;//              textBox1.AppendText("0x" + str);}}

发送按钮的事件

private void buttonSend_Click(object sender, EventArgs e){if (serialPort1.IsOpen){if (radioButtonSendAsc2.Checked)//如果发送模式是字符模式{serialPort1.WriteLine(textBoxSend.Text);//写数据}else{try{byte[] Data = new byte[1];                                            //用于缓存for (int i = 0; i < (textBoxSend.Text.Length - textBoxSend.Text.Length % 2) / 2; i++)//取余3运算作用是防止用户输入的字符为奇数个{Data[0] = Convert.ToByte(textBoxSend.Text.Substring(i * 2, 2), 16);serialPort1.Write(Data, 0, 1);                                  //循环发送(如果输入字符为0A0BB,则只发送0A,0B)}if (textBoxSend.Text.Length % 2 != 0)//剩下一位单独处理{Data[0] = Convert.ToByte(textBoxSend.Text.Substring(textBoxSend.Text.Length - 1, 1), 16);//单独发送B(0B)serialPort1.Write(Data, 0, 1);                                      //发送}}catch(Exception err){MessageBox.Show(err.ToString(), "错误");//出错提示serialPort1.Close();buttonOpen.Text = "打开串口";               //将按钮文本"关闭串口"改为"打开串口"}}}}

最后的话,自己定义一套通讯协议,与相应的下位机连接试试吧!

C#编程简单模拟与下位机的串口通信相关推荐

  1. C#上位机开发串口通信编程——倒计时器开发

    C#上位机开发串口通信编程--倒计时器开发 一.介绍 这是我按照B站上的一个上位机开发视频教程开发的倒计时器开发,本来只有开始计时功能,没有停止计时功能,停止计时功能后面我自己添加了. 视频网址:C# ...

  2. Proteus模拟STM32F103R6微控制器之串口通信USART的方法

    Proteus模拟STM32F103R6微控制器之串口通信USART的方法,实验环境如下: 模拟软件:Proteus 8.11 SP0 开发环境:Keil MDK 5.33 参考资料:ST公司官方参考 ...

  3. s7300plc串口通信_基于LabVIEW的S7300PLC与PC机的串口通信.pdf

    基于LabVIEW的S7300PLC与PC机的串口通信 2011 仪 表 技 术 与 传 感 器 2011 5 Instrument Technique and Sensor No5 LabV IEW ...

  4. C#上位机开发串口通信

    一.创建一个Winform窗体,制作一个5s定时器 using System; using System.Windows.Forms;namespace 计时器 {public partial cla ...

  5. Qt中Qchart插件实现PMW3901迷你光流模块上位机(串口通信)

    文章目录 Qt中Qchart插件实现PMW3901迷你光流模块上位机 光流计介绍 上位机 完整工程[猛戳这儿](https://github.com/LiangtaoZhong/PMW3901-mon ...

  6. wpf上位机 modbus串口通信,获取收发数据的完整报文

    一. 1.网上很多modbus类库,封装的方法,大多只获取返回的数据,而不是完整的报文,有时使用不便. 2.大多类库"读取"有返回值,而"写"时没有返回值,不好 ...

  7. PC机之间串口通信传输文件

    参考资料 本文内容:本文主要介绍如何实现两电脑之间的串口通信.将两台笔记本电脑,借助 usb转TTL 模块和杜邦线,建立起串口连接.然后用串口助手等工具软件(带文件传输功能)将一台笔记本上的一个大文件 ...

  8. QT5实现串口收发数据(上位机与下位机通信)

    最近帮老师做一个应用程序,通过上位机与下位机进行串口通信,最后实现实时绘图,通过几天努力,成功实现蓝牙串口通信. 参考博客1 注意:代码中一些与串口无关代码,可以忽略掉 一.QT5串口基础知识 1. ...

  9. python编程与下位机通讯_如何使用Python开发串口通讯上位机(一)

    用Python开发串口通讯型上位机,其实并非最优解,本系列更新只为个人学习与总结.如果有C语言底子,嵌入式层面的上位机开发,C++ Builder,C#才是更加好用的利器.1 什么是上位机 从事过嵌入 ...

最新文章

  1. How to Rate a Software Developer
  2. C++接口定义及实现举例
  3. NA-NP-IE系列实验30:CHAP 认证
  4. webpack与vue环境搭建(转载)
  5. 用HttpReports快速搭建API分析平台
  6. PRML-系列一之1.5.5~1.5.6
  7. 9种高性能可用高并发的技术架构
  8. 获取变量数据类型(JS)
  9. pytorch学习:运行Mask R-CNN例程
  10. 理解Active Directory中用户登录的具体行为
  11. 单片机实验(流水灯)(c语言程序),51单片机c语言_单片机流水灯c语言程序_单片机c语言入门...
  12. 图片打印设置之适应边框打印
  13. 重庆大学计算机学院马前,以梦为马,以论为矛
  14. yolov5环境配置及训练coco128数据集
  15. TDA4VM PDK应用笔记
  16. java类与对象实验报告心得体会_java实习实训报告心得【三篇】
  17. 管理 Office com 加载项
  18. 怎样用网址查询微信公众号的二维码
  19. css样式单位px,em,pt,ex,pc,in,mm,cm详解
  20. BiSeNet V2网络结构详解

热门文章

  1. vista系统服务器,Windows VISTA操作系统各发行版本详尽介绍
  2. 【React】React——redux
  3. DIV在FLASH上面、FLASH透明背景
  4. 通俗理解决策树算法中的信息增益(最朴实的大白话,保准能看懂)
  5. 史蒂芬·乔布斯amp;斯坦福大学
  6. java实现智能拼图_JAVA实现拼图游戏
  7. force语句的使用
  8. IT风投案例分析——facebook
  9. python幸运数字判断_幸运数字 小程序
  10. 灰度图像特征提取之统计方式详解