• C#:串口控制下位机开关


    1. 单片机下位机控制程序

    /*********************************************************************************************
    出品:        杜洋工作室 DoYoung Studio
    程序名:    DB1-011 电脑控制电源插座
    编写人:    杜洋 
    编写时间:    2013年01月17日
    硬件支持:    DB1(PCB1)   
    修改日志:  
    1-2013011723 完成开发,4路开关控制+全局开关
    2-2013011900 加入5到11路的扩展项目                                
    /*********************************************************************************************
    说明:
    请使用DBC软件进行控制。
    DB1端串口波特率4800,每次接收2个字节的数据(数据头码+控制项目序号)
    
    /*********************************************************************************************/
    #include <reg52.h>    //头文件
    #define HEAD 0x00//数据头码
    sbit J1 = P1 ^ 3;//控制器接口定义 
    sbit J2 = P3 ^ 2;// 
    sbit J3 = P1 ^ 4;// 
    sbit J4 = P1 ^ 5;// 
    sbit J5 = P1 ^ 7;//5-11路没有使用(第12路用作了全局开关) 
    sbit J6 = P1 ^ 7;// 
    sbit J7 = P1 ^ 7;// 
    sbit J8 = P1 ^ 7;// 
    sbit J9 = P1 ^ 7;// 
    sbit J10 = P1 ^ 7;// 
    sbit J11 = P1 ^ 7;// 
    /*********************************************************************************************/
    void DELAY_MS (unsigned int a){//毫秒级延时
        unsigned int i;
        while( a-- != 0){
            for(i = 0; i < 600; i++);
        }
    }
    /*********************************************************************************************/
    void UART_init (void){//UART串口初始化函数
        TMOD = 0x20;    //定时器T/C1工作方式2
        SCON = 0x50;    //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
        TH1 = 0xF3;    //定时器初值高8位设置
        TL1 = 0xF3;    //定时器初值低8位设置
        PCON = 0x80;    //波特率倍频(屏蔽本句波特率为2400)
        TR1 = 1;    //定时器启动    
    }
    /**********************************************************************************************/
    void main (void){
        unsigned char UART_data1,UART_data2; //定义串口接收数据变量
        unsigned int s; //
        DELAY_MS(1000);//延时防止下载时死机
        UART_init();//串口初始化(查寻)
        while(1){
            if (RI == 1){        //接收中断标志位为1时//接受数据头码
                UART_data1 = SBUF;    //接收数据 SBUF 为单片机的接收发送缓冲寄存器
                RI = 0;            //令接收中断标志位为0(软件清零)
                s=0;
                while (s<2000&&UART_data1==HEAD){//判断头码是否正确,等待时间过长时跳出。
                    s++;
                    if (RI == 1){//开始接受控制数据
                        UART_data2 = SBUF;//
                        RI = 0;
                        switch (UART_data2){
                            case 0x01:J1=0;break;//第1路开
                            case 0x81:J1=1;break;//第1路关
                            case 0x02:J2=0;break;
                            case 0x82:J2=1;break;
                            case 0x03:J3=0;break;
                            case 0x83:J3=1;break;
                            case 0x04:J4=0;break;
                            case 0x84:J4=1;break;
                            case 0x05:J5=0;break;
                            case 0x85:J5=1;break;
                            case 0x06:J6=0;break;
                            case 0x86:J6=1;break;
                            case 0x07:J7=0;break;
                            case 0x87:J7=1;break;
                            case 0x08:J8=0;break;
                            case 0x88:J8=1;break;
                            case 0x09:J9=0;break;
                            case 0x89:J9=1;break;
                            case 0x0A:J10=0;break;
                            case 0x8A:J10=1;break;
                            case 0x0B:J11=0;break;
                            case 0x8B:J11=1;break;
                            case 0x0C:J1=0;J2=0;J3=0;J4=0;J5=0;J6=0;J7=0;J8=0;J9=0;J10=0;J11=0;break;//全局开关
                            case 0x8C:J1=1;J2=1;J3=1;J4=1;J5=1;J6=1;J7=1;J8=1;J9=1;J10=1;J11=1;break;
                            default://冗余语句
                                break;
                        }
                    }
                }
            }
        }
    }
    /**********************************************************************************************/
    //杜洋工作室 DoYoung Studio
    /*********************************************************************************************/

    2. 上位机界面

    3. 上位机编程

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    using System.IO.Ports;
    
    namespace 串口控制
    {
        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;
            //SerialPort Write Buffer
            byte[] SerialPortDataBuffer = new byte[1];
            public Form1()
            {
                InitializeComponent();                                      //窗口构造
            }
            private void button1_Click(object sender, EventArgs e)
            {
                if (serialPort1.IsOpen)                                     //串口打开就关闭
                {
                    try
                    {
                        serialPort1.Close();
                    }
                    catch { }                                               //确保万无一失
                    ovalShape1.FillColor = Color.Gray;
                    button1.Text = "打开串口";
                }
                else
                {
                    try
                    {
                        serialPort1.PortName = comboBox1.Text;              //端口号
                        serialPort1.Open();                                 //打开端口
                        ovalShape1.FillColor = Color.Green;
                        button1.Text = "关闭串口";
                    }
                    catch
                    {
                        MessageBox.Show("串口打开失败","错误");
                    }
                }
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                ovalShape1.FillColor = Color.Gray;
                SearchAndAddSerialToComboBox(serialPort1, comboBox1);
            }
    
            private void WriteByteToSerialPort(byte data)                   //单字节写入串口
            {
                byte[] Buffer = new byte [2]{0x00, data };                       //定义数组
                if (serialPort1.IsOpen)                                     //传输数据的前提是端口已打开
                {
                    try
                    {
                        serialPort1.Write(Buffer, 0, 2);                    //写数据
                    }
                    catch 
                    {
                        MessageBox.Show("串口数据发送出错,请检查.","错误");//错误处理
                    }
                }
            }
    
            private void SearchAndAddSerialToComboBox(SerialPort MyPort,ComboBox MyBox)
            {                                                               //将可用端口号添加到ComboBox
                //string[] MyString = new string[20];                         //最多容纳20个,太多会影响调试效率
                string Buffer;                                              //缓存
                MyBox.Items.Clear();                                        //清空ComboBox内容
                //int count = 0;
                for (int i = 1; i < 20; i++)                                //循环
                {
                    try                                                     //核心原理是依靠try和catch完成遍历
                    {
                        Buffer = "COM" + i.ToString();
                        MyPort.PortName = Buffer;
                        MyPort.Open();                                      //如果失败,后面的代码不会执行
                       // MyString[count] = Buffer;
                        MyBox.Items.Add(Buffer);                            //打开成功,添加至下俩列表
                        MyPort.Close();                                     //关闭
                        //count++;
                    }
                    catch 
                    {
                        //count--;
                    }
                }
                //MyBox.Text = MyString[0];                                   //初始化
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                WriteByteToSerialPort(DeviceOpen1);                         //器件一开
            }
    
            private void button3_Click(object sender, EventArgs e)
            {
                WriteByteToSerialPort(DeviceClose1);                        //器件一关
            }
    
            private void button5_Click(object sender, EventArgs e)
            {
                WriteByteToSerialPort(DeviceOpen2);                         //器件二开
            }
    
            private void button4_Click(object sender, EventArgs e)
            {
                WriteByteToSerialPort(DeviceClose2);                        //器件二关
            }
    
            private void button7_Click(object sender, EventArgs e)
            {
                WriteByteToSerialPort(DeviceOpen3);                         //器件三开
            }
    
            private void button6_Click(object sender, EventArgs e)
            {
                WriteByteToSerialPort(DeviceClose3);                        //器件三关
            }
    
            private void button8_Click(object sender, EventArgs e)
            {
                SearchAndAddSerialToComboBox(serialPort1, comboBox1);       //扫描并讲课用串口添加至下拉列表
            }
    
            private void ovalShape1_Click(object sender, EventArgs e)
            {
    
            }
        }
    }
  • 相关阅读:
    saltstack学习
    linux命令学习(2):wc 命令
    linux命令学习(1):grep 命令
    Docker Compose—简化复杂容器应用的利器
    Docker-compose命令详解
    Python json数据写入csv json excel文件
    Centos 不重启 修改ulimit参数
    pip包管理工具 基本使用
    python 使用xpath解析含有命名空间(xmlns)的xml
    pyqt5 + pyinstaller 制作爬虫小程序
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/16113747.html
Copyright © 2020-2023  润新知