IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> C#上位机(串口控制(二)) -> 正文阅读

[嵌入式]C#上位机(串口控制(二))

1.打开串口图形化
1.1 绘制图形,我在画图工具中绘制了三个图,只是中间的颜色不一致而已。
在这里插入图片描述
1.2 右键工程名,我这里是Control.点击属性。
在这里插入图片描述
1.3 点击资源,选择图像,添加资源中选择“添加现有资源”,然后选择自己绘制的图形。添加好后,给其重新命名。这里命名为image1,image2,image3.
在这里插入图片描述
1.4 对打开串口按钮进行属性编辑。BackgroundImage–选择初始化时的图像,这里我选择image3.BackgroundImageLayout选择Center,让其置于中间。这样界面就设计ok了。
在这里插入图片描述
在这里插入图片描述
2.程序编辑

这块实现的功能,就是,串口打开为绿色。串口关闭为灰色。鼠标移动在串口按钮上为红色。离开按钮时与串口原先状态保持一致。打开就绿色,关闭就灰色。

2.1 串口按钮函数中设计
2.1.1 串口关闭时
在这里插入图片描述
2.1.2 串口打开时
在这里插入图片描述
2.1.3 全局变量,定义了一个串口状态的变量
在这里插入图片描述
2.1.4 鼠标放在按钮上的操作,放在上面显示红色。
在这里插入图片描述
2.1.5 鼠标离开时的函数,跟原来状态保持一致。
在这里插入图片描述
3.代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;

namespace Control
{
    public partial class Form1 : Form
    {
        //============================================下位机控制======================================================================
        //定义全局变量--需要跟下位机保持一致
        //device 1
        const byte DeviceOpen1 = 0x01;
        const byte DeviceClose1 = 0x81;

        //device 2
        const byte DeviceOpen2 = 0x02;
        const byte DeviceClose2 = 0x82;

        //device 3
        const byte DeviceOpen3 = 0x03;
        const byte DeviceClose3 = 0x83;

        //鼠标移动时串口的状态
        bool button2Statue = true;

        //定义一个串口写内存
        byte[] SerialPortDataBuffer = new byte[1];

        //封装一个单字节写入串口
        private void WriteByteToSerialPort(byte data)
        {
            //定义一个缓冲区数组,里面两个字节,一个是0x00头码, 一个是data
            byte[] Buffer = new byte[2]{0x00, data};

            if (serialPort1.IsOpen)
            {
                try
                {
                    //串口写数据:将缓冲区的数组内容全部写入。
                    //Write(): 
                    //     使用缓冲区的数据将指定数量的字节写入串行端口。
                    // 参数: 
                    //   buffer:
                    //     包含要写入端口的数据的字节数组。
                    //   offset:
                    //     buffer 参数中从零开始的字节偏移量,从此处开始将字节复制到端口。
                    //   count:
                    //     要写入的字节数。
                    serialPort1.Write(Buffer, 0, 2);
                }
                catch 
                {
                    MessageBox.Show("串口发送数据错误", "错误提示");
                }
            }
            else
            {
                MessageBox.Show("串口未打开", "提示");
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            WriteByteToSerialPort(DeviceOpen1);//N0.1开
        }

        private void button4_Click(object sender, EventArgs e)
        {
            WriteByteToSerialPort(DeviceClose1);//N0.1关
        }

        private void button5_Click(object sender, EventArgs e)
        {
            WriteByteToSerialPort(DeviceOpen2);//N0.2开
        }

        private void button6_Click(object sender, EventArgs e)
        {
            WriteByteToSerialPort(DeviceClose2);//N0.2关
        }

        private void button7_Click(object sender, EventArgs e)
        {
            WriteByteToSerialPort(DeviceOpen3); //N0.3开
        }

        private void button8_Click(object sender, EventArgs e)
        {
            WriteByteToSerialPort(DeviceClose3);//N0.3关
        }
        //===============================================扫描函数==========================================================
        public Form1()
        {
            InitializeComponent();
        }

        //窗口事件
        private void Form1_Load(object sender, EventArgs e)
        {
            //设置ovalShape1控件为灰色,
            //注意该控件刚开始时没有填充,需要在属性中选择FillStyle ---》 solid ---》其次可以修改FileColor的颜色/在程序中修改
            //由于VS2013没有相关控件,暂时屏蔽掉
            //ovalShape1.FillColor = Color.Gray;
        }

        //扫描串口,将可用的串口号添加到ComboBox
        //SerialPort是一个串口类,对象为MyPort
        //ComboBox是一个控件类,对象为MyBox
        private void SearchAndSerialComboBox(SerialPort MyPort, ComboBox MyBox)
        { 
            //定义20个串口信息,太多会影响调试效率
            //string[] MyString = new string[20];
            //定义一个内存缓存变量
            string Buffer;
            //清空ComboBox下拉控件内容
            MyBox.Items.Clear();
            //遍历20个串口
            for (int i = 1; i < 20; i++)
            {
                //巧妙的使用try{}catch,进行串口扫描。因MyPort.Open();如果运行失败,后面的代码就不执行了,直接跳转至catch。
                //如果运行成功,就将相应的串口信息添加至ComboBox。
                try
                {
                    //将读取的串口信息存在内存中
                    Buffer = "COM" + i.ToString();
                    //将内存中的串口信息给相应的控件
                    MyPort.PortName = Buffer;
                    //打开串口如果运行失败,后面的代码就不执行了,直接跳转至catch。
                    MyPort.Open();
                    //将内存中的串口信息放在字符串数组中
                    //MyString[i - 1] = Buffer;
                    //将获取的串口添加到ComboBox
                    MyBox.Items.Add(Buffer);
                    //关闭串口
                    MyPort.Close();
               }
               catch
               {
               }
            }
            //初始化串口
            //MyBox.Text = MyString[0];
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //串口打开时执行串口关闭的操作
            if (serialPort1.IsOpen)
            { 
                try
                {
                    //关闭串口
                    serialPort1.Close();
                    //点击关闭串口按钮后,ovalShape1控件颜色为灰色
                    //ovalShape1.FillColor = Color.Gray;
                    //将打开串口按钮置为打开串口
                    button2.Text = "打开串口";

                    //此时为关闭串口-灰色
                    button2.BackgroundImage = Properties.Resources.image3;
                    //串口打开--按钮状态
                    button2Statue = true;
                }
                catch 
                {
                    MessageBox.Show("串口关闭·1失败", "错误提示");
                }
           }
            //关闭串口执行串口打开的操作
            else
            {
                try
                {
                    //获取串口号
                    serialPort1.PortName = comboBox1.Text;
                    //打开串口
                    serialPort1.Open();
                    //点击打开串口按钮后,将ovalShape1控件编成绿色。
                    //放在打开串口按钮后进行操作。因为如果打开失败就无法将ovalShape1控件编成绿色。
                    //ovalShape1.FillColor = Color.Green;
                    //将打开串口按钮置为关闭串口
                    button2.Text = "关闭串口";

                    //此时为打开串口状态-绿色
                    button2.BackgroundImage = Properties.Resources.image2;
                    //串口关闭--按钮状态
                    button2Statue = false;

                }
                catch
                {
                    MessageBox.Show("串口打开失败","错误提示");
                }
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //扫描串口信息,为了之后方便使用,此处进行封装一个串口扫描的函数
            SearchAndSerialComboBox(serialPort1, comboBox1);
        }

        //=======鼠标移动,打开串口按钮的状态,打开为绿,关闭为灰,鼠标移动在上面是红,移开时串口打开为绿,关闭为灰============
        //image1红色;image3灰色;image2绿色。
        //鼠标放在上面的函数
        private void button2_MouseHover(object sender, EventArgs e)
        {
            button2.BackgroundImage = Properties.Resources.image1;
        }
        //鼠标离开时的函数
        private void button2_MouseLeave(object sender, EventArgs e)
         {
            //鼠标移开,与原来状态保持一致
             //button2Statue为true时,串口关闭状态。串口关--则灰色
             if (button2Statue)
             {
                 button2.BackgroundImage = Properties.Resources.image3;
             }
             //button2Statue为false时,串口打开状态。串口开--则绿色
             else
             {
                 button2.BackgroundImage = Properties.Resources.image2;
             }
            
         }
        //================================================================================================================
      
    }
}

上期链接:
1: C#上位机(串口控制(一)).

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:07:25  更:2022-03-21 21:08:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:37:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码