ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-04-07 19:02:25  阅读:195  来源: 互联网

标签:P1 C# void private 下位 串口 sbit byte


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)
        {

        }
    }
}

 

标签:P1,C#,void,private,下位,串口,sbit,byte
来源: https://www.cnblogs.com/JasperZhao/p/16113747.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有