一、创建一个Winform窗体,制作一个5s定时器

using System;
using System.Windows.Forms;namespace 计时器
{public partial class Form1 : Form{int count;int time;public Form1(){InitializeComponent();}private void label1_Click(object sender, EventArgs e){}private void Form1_Load(object sender, EventArgs e){for (int i = 1; i < 6; i++){comboBox1.Items.Add(i.ToString() + " 秒");}label3.Text = "";}//定时器事件private void timer1_Tick(object sender, EventArgs e){count++;//记当前秒label3.Text = (time - count).ToString() + " 秒";//显示剩余时间progressBar1.Value = count;//设置进度条进度if(count==time){timer1.Stop();//时间到,停止计时System.Media.SystemSounds.Asterisk.Play();//提示音MessageBox.Show("时间到!");//弹出提示框}}//按钮 开始计时事件private void button1_Click(object sender, EventArgs e){string str=comboBox1.Text;//将下拉框内容添加到一个变量中time = Convert.ToInt32(str.Substring(0,2));//得到设定定时值(整形)progressBar1.Maximum = time;//进度条最大数值timer1.Start();//开始计时}}
}

运行结果如下:

二、串口发数据

using System;
using System.Windows.Forms;namespace 串口发数据
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void label1_Click(object sender, EventArgs e){}//窗口创建初始化函数private void Form1_Load(object sender, EventArgs e){string str;//用来临时存储大写的十六进制格式字符串for(int i=0;i<256;i++){//ToString("x")写法的目的:是为了将数字转换为16进制字符串,ToUpper是将字符串所有字符大写str = i.ToString("x").ToUpper();//comboBox1.Items.Add("0x"+(str.Length==1?"0"+str:str));//如果是一位的(0xA),此时为了对齐,在数据前加一个字符"0"(0x0a)if (str.Length == 1)str = "0" + str;comboBox1.Items.Add("0x" + str);//统一添加"0x"}comboBox1.Text = "0X00";//初始值}//按键单击事件private void button1_Click(object sender, EventArgs e){//存储当前下拉框的内容string data = comboBox1.Text;//把字符分开string convertdata = data.Substring(2, 2);//数据一个字节就够用了byte[] buffer = new byte[1];//将字符串转化为byte型变量(byte相当于单片机中unsigned )buffer[0] = Convert.ToByte(convertdata, 16);try {serialPort1.Open();serialPort1.Write(buffer, 0, 1);serialPort1.Close();}catch{//如果是写数据时出错,此时窗口状态为开,就应关闭串口,防止下次不能使用,串口是不能重复打开和关闭的。if (serialPort1.IsOpen)serialPort1.Close();MessageBox.Show("端口错误", "错误");}}}
}

运行结果为:

三、

using System;
using System.IO.Ports;
using System.Windows.Forms;namespace 开发串口助手
{public partial class Form1 : Form{public Form1(){InitializeComponent();Control.CheckForIllegalCrossThreadCalls = false;}private void radioButton2_CheckedChanged(object sender, EventArgs e){}private void label5_Click(object sender, EventArgs e){}//打开端口private void button1_Click(object sender, EventArgs e){try{serialPort1.PortName = comboBox1.Text;serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text,10);//十进制数据转换serialPort1.Open();button1.Enabled = false;//按钮“打开串口”不可用button2.Enabled = true;//按钮“关闭串口”}catch{MessageBox.Show("端口错误,请检查串口", "错误");}}private void radioButton3_CheckedChanged(object sender, EventArgs e){}//初始化private void Form1_Load(object sender, EventArgs e){for(int i=1;i<20;i++){comboBox1.Items.Add("COM" + i.ToString());}comboBox1.Text = "COM1";//串口号默认值comboBox2.Text = "4800";//波特率默认值//需要手动添加串口的事件处理serialPort1.DataReceived +=new SerialDataReceivedEventHandler(port_DataReceived);}//串口数据接收事件private void port_DataReceived(object sender,SerialDataReceivedEventArgs e){//如果接收模式为字符模式if(!radioButton3.Checked){string str = serialPort1.ReadExisting();//字符串方式读textBox1.AppendText(str);//添加内容}else//如果接收模式为数值模式{byte data;data = (byte)serialPort1.ReadByte();//强制类型转换,将int类型数据转换为byte类型数据string str = Convert.ToString(data, 16).ToUpper();//转换为大写十六进制字符串textBox1.AppendText("0x" + (str.Length == 1 ? "0" + str : str) + " ");//空位补"0"}}//关闭端口private void button2_Click(object sender, EventArgs e){try{serialPort1.Close();//关闭串口button1.Enabled = true;//按钮“打开串口” 可用button2.Enabled = false;//按钮“关闭串口” 不可用}catch(Exception err)//一般情况下关闭串口不会出错,所以不需要加处理程序{}}//发送private void button3_Click(object sender, EventArgs e){byte[] Data = new byte[1];//判断串口是否打开if(serialPort1.IsOpen){if(textBox2.Text!=""){//如果发送模式是字符模式if (!radioButton1.Checked){try{serialPort1.WriteLine(textBox2.Text);//写数据}catch (Exception err){MessageBox.Show("串口数据写入错误", "错误");serialPort1.Close();button1.Enabled = true;//打开串口按钮可用button2.Enabled = false;//关闭串口按钮不可用}}else{//取余运算作用:防止用户输入的字符为奇数个。for(int i=0;i<(textBox2.Text.Length-textBox2.Text.Length%2)/2;i++){Data[0] = Convert.ToByte(textBox2.Text.Substring(i * 2, 2), 16);serialPort1.Write(Data, 0, 1);//循环发送(如果输入字符为0A0BB,则只发送0A,0B)}//剩下一位单独处理if(textBox2.Text.Length%2!=0){//单独发送B(0B)Data[0] = Convert.ToByte(textBox2.Text.Substring(textBox2.Text.Length - textBox2.Text.Length%2,textBox2.Text.Length%2),16);serialPort1.Write(Data, 0, 1);//发送}}}}}//文本控件内容改变事件private void textBox1_TextChanged(object sender, EventArgs e){textBox1.ScrollToCaret();//将滚动条调至最下}}
}

串口连接后,运行结果为:

四、串口控制

/*串口控制下位机开关*/
using System;
using System.Drawing;
using System.IO.Ports;
using System.Windows.Forms;namespace 串口控制
{public partial class Form1 : Form{//设备1const byte DeviceOpen1 = 0x01;const byte DeviceClose1 = 0x81;//设备2const byte DeviceOpen2 = 0x02;const byte DeviceClose2 = 0x82;//设备3const byte DeviceOpen3 = 0x03;const byte DeviceClose3 = 0x83;//SerialPort Write Bufferbyte[] SerialPortDataBuffer = new byte[1];public Form1(){InitializeComponent();}//打开串口private void button2_Click(object sender, EventArgs e){if(serialPort1.IsOpen){try{serialPort1.Close();}catch { }ovalShape1.FillColor = Color.Gray;button2.Text = "打开串口";}else{try{serialPort1.PortName = comboBox1.Text;//端口号serialPort1.Open();//打开端口ovalShape1.FillColor = Color.Green;button2.Text = "关闭串口";}catch{MessageBox.Show("串口打开失败", "错误");}}}//窗体初始化private void Form1_Load(object sender, EventArgs e){ovalShape1.FillColor = Color.Gray;SearchAndAddSerialToComboBox(serialPort1, comboBox1);}//设备一开private void button3_Click(object sender, EventArgs e){WriteByteToSerialPort(DeviceOpen1);}//设备一关private void button4_Click(object sender, EventArgs e){WriteByteToSerialPort(DeviceClose1);}//设备二开private void button5_Click(object sender, EventArgs e){WriteByteToSerialPort(DeviceOpen2);}//设备二关private void button6_Click(object sender, EventArgs e){WriteByteToSerialPort(DeviceClose2);}//设备三开private void button7_Click(object sender, EventArgs e){WriteByteToSerialPort(DeviceOpen3);}//设备三关private void button8_Click(object sender, EventArgs e){WriteByteToSerialPort(DeviceClose3);}//扫描并将扫描到的串口添加到下拉列表private void button1_Click(object sender, EventArgs e){SearchAndAddSerialToComboBox(serialPort1, comboBox1);}//扫描:将可用端口号添加到ComboBoxprivate void SearchAndAddSerialToComboBox(SerialPort MyPort, ComboBox MyBox){string Buffer;//缓存MyBox.Items.Clear();//清空ComboBox内容for (int i = 1; i < 20; i++){try{Buffer = "COM" + i.ToString();MyPort.PortName = Buffer;MyPort.Open();MyBox.Items.Add(Buffer);//添加到下拉列表MyPort.Close();}catch{}}}//把数据写入串口private void WriteByteToSerialPort(byte data){byte[] Buffer = new byte[2] { 0x00, data };if (serialPort1.IsOpen){try{serialPort1.Write(Buffer, 0, 2);//写数据}catch{MessageBox.Show("串口数据发送出错,请检查", "错误");}}}}
}

首先打开电脑设备管理器,先查看一下电脑上有几个串口:

运行结果为:

五、图形化按钮设计

C#上位机开发串口通信相关推荐

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

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

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

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

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

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

  4. 485通信原理_上位机开发之单片机通信实践

    经常会有一些学员会问到上位机与单片机之间通信的问题,而我们经常会讲上位机与PLC之间通信,那么其实对上位机开发来说,不管是和PLC通信,还是和单片机通信,通信原理都是一样的.PLC的本质就是单片机,在 ...

  5. pythonqt4上位机开发_「新阁教育」自由口通信上位机实战案例

    1.引言 组态软件作为一种通用软件,体系结构较为庞大.功能软件包多.价格也比较昂贵,而且对于一些复杂的业务逻辑或自定义的协议,实现起来比较麻烦.近几年,C#/.NET上位机开发应用越来越广泛,相对于传 ...

  6. pythonqt4上位机开发_上位机开发之单片机通信实践(一)

    经常会有一些学员会问到上位机与单片机之间通信的问题,而我们经常会讲上位机与PLC之间通信,那么其实对上位机开发来说,不管是和PLC通信,还是和单片机通信,通信原理都是一样的.PLC的本质就是单片机,在 ...

  7. 485通信原理_上位机开发之单片机通信实践(一)

    微信号 :thinger_swj微博:@新阁程序园扫码关注 经常会有一些学员会问到上位机与单片机之间通信的问题,而我们经常会讲上位机与PLC之间通信,那么其实对上位机开发来说,不管是和PLC通信,还是 ...

  8. java开发plc上位机软件开发_上位机开发之西门子PLC-S7通信实践

    写在前面: 就目前而言,在中国的工控市场上,西门子仍然占了很大的份额,因此对于上位机开发而言,经常会存在需要与西门子PLC进行通信的情况.然后对于西门子PLC来说,通信方式有很多,下面简单列举一下: ...

  9. 信捷plc485通信上位机_上位机开发之三菱FX3U以太网通信实践

    上次跟大家介绍了一下上位机与三菱Q系列PLC通信的案例,大家可以通过点击这篇文章: dotNet工控上位机:上位机开发之三菱Q系列PLC通信实战​zhuanlan.zhihu.com 今天以三菱FX3 ...

最新文章

  1. autoware中lgsvl Simulator安装与使用:LGsvl Simulator 2021.2.1版(九)
  2. 会用python把linux命令写一遍的人,进大厂有多容易?
  3. iOS 如何让IOS应用从容地崩溃
  4. hibernate中一对多关系的映射
  5. seaborn.heatmap概述
  6. 十大经典排序算法python_十大经典排序算法的算法描述和代码实现
  7. jmeter上传文件搞了一天,才搞定,没高人帮忙效率就是低,赶紧记下来,以备后用...
  8. HT68F30控制GPG96244QS1 TFT液晶屏
  9. 机器学习】LDA线性判别分析
  10. java 线程状态_面试官问:为什么Java线程没有Running状态?我懵了
  11. 9203班级纪律 1202
  12. 第二十三章:准备原材料
  13. 基于深度学习的搜索、推荐、广告系统最全最新论文分享
  14. oracle 测试坚挺,access数据库用户依然坚挺,但是面临新的对手挑战
  15. Python 访问限制 private public
  16. 服务器电源ic芯片,8种常见电源管理IC芯片介绍
  17. Java亿级流量架构之网关设计思路
  18. UE《空山新雨后》总结笔记
  19. 寻找我心中的产品经理
  20. 很多人都想考一个RHCE吧,大家不妨看看我是怎么变成一个RHCE的。

热门文章

  1. 2.6 自定义srv python
  2. 地理信息辅助空间决策
  3. 透明LED显示屏:透明世界中的无限可能
  4. outlook2010 pst文件压缩方法
  5. 发现21cn邮箱存在严重的安全漏洞及风险,对于申请密保的邮箱可以随便更改任意用户的密码...
  6. 【2019年04月03日】A股最便宜的股票
  7. SP-51pro单片机编程器
  8. UiPath被Everest Group评为PEAK Matrix®流程挖掘产品领导者和明星企业
  9. 彤云垂暮,落日渐歇,秋水潋滟,葳蕤已覆。
  10. 2020-07-11