• C#:带校验的串口开关控制


    1. 效果图

    2. 单片机端代码

    /*********************************************************************************************/
    #include<reg52.h>    //标准51头文件
    /*********************************************************************************************
    函数名:UART串口初始化函数
    调  用:UART_init();
    参  数:无
    返回值:无
    结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
    备  注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
    /**********************************************************************************************/
    void UART_init (void){
        EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
        ES = 1; //允许UART串口的中断
    
        TMOD = 0x20;    //定时器T/C1工作方式2
        SCON = 0x50;    //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
        TH1 = 0xF3;    //定时器初值高8位设置
        TL1 = 0xF3;    //定时器初值低8位设置
        PCON = 0x80;    //波特率倍频(屏蔽本句波特率为2400)
        TR1 = 1;    //定时器启动    
    }
    /**********************************************************************************************/
    /*********************************************************************************************
    函数名:UART串口接收中断处理函数
    调  用:[SBUF收到数据后中断处理]
    参  数:无
    返回值:无
    结  果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)
    备  注:过长的处理程序会影响后面数据的接收
    /**********************************************************************************************/
    void UART_R (void) interrupt 4  using 1{ //切换寄存器组到1
        unsigned char UART_data; //定义串口接收数据变量
        RI = 0;            //令接收中断标志位为0(软件清零)
        UART_data = SBUF;    //将接收到的数据送入变量 UART_data
        SBUF = ~UART_data;    //将接收的数据发送回去
        while(TI == 0);    //检查发送中断标志位
        TI = 0;        //令发送中断标志位为0(软件清零)
    }    
    /**********************************************************************************************/
    void main()
    {
        UART_init();  //初始化
        while(1);      //主循环
    }
    /**********************************************************************************************/

    3. C#代码

    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 Reply
    {
        public partial class Form1 : Form
        {
            byte DataSended = 0;
            byte[] DataToSend = new byte[] { 0x01, 0x02, 0x03 };                                               //数据发送
            public Form1()
            {
                InitializeComponent();
                System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
                serialPort1.DataReceived += new SerialDataReceivedEventHandler(SerialPortDataReceived);       //添加串口中断事件
            }
    
            private void SetOvlShape(int which)                                                               //填充颜色   
            {
                switch(which)
                {
                    case 1:
                        ovalShape1.FillColor = Color.Green;
                        ovalShape2.FillColor = Color.Red;
                        ovalShape3.FillColor = Color.Red;
                        break;
                    case 2:
                        ovalShape1.FillColor = Color.Red;
                        ovalShape2.FillColor = Color.Green;
                        ovalShape3.FillColor = Color.Red;
                        break;
                    case 3:
                        ovalShape1.FillColor = Color.Red;
                        ovalShape2.FillColor = Color.Red;
                        ovalShape3.FillColor = Color.Green;
                        break;
                    case 4:
                        ovalShape1.FillColor = Color.Green;
                        ovalShape2.FillColor = Color.Green;
                        ovalShape3.FillColor = Color.Green;
                        break;
                    default:
                        break;
                }
            }
    
            private void SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                byte DataReceived = (byte)(~serialPort1.ReadByte());                                           //单字节读取
                try
                {
                    timer1.Stop();                                                                          //关定时器
                }
                catch { }
                if (DataSended == 0)                                                                        //防止下位机乱发,不处理
                    return;
                SetOvlShape(DataReceived);
                try
                {
                    if (DataToSend[DataSended - 1] == DataReceived)                                            //校验数据
                    {
                        MessageBox.Show("数据校验成功", "成功!");                                              //弹出提示
                    }
                    else
                    {
                        MessageBox.Show("数据校验失败", "数据校验失败");
                    }
                }
                catch
                {
    
                }
            }
    
            private void button1_Click(object sender, EventArgs e)                                          //打开/关闭串口
            {
                if (serialPort1.IsOpen)                                                                     //一堆处理……
                {
                    try
                    {
                        serialPort1.Close();
                    }
                    catch
                    {
    
                    }
                    button1.Text = "打开串口";
                }
                else
                {
                    try
                    {
                        serialPort1.PortName = comboBox1.Text;                                              //串口号    
                        serialPort1.Open();                                                                 //打开
                    }
                    catch
                    {
                        MessageBox.Show("串口打开错误,请检查", "串口");
                    }
                    button1.Text = "关闭串口";
                }
            }
    
            private void SendDataToSerialPort(SerialPort MyPort, byte DataToSend)                            //单字节发送数据    
            {
                byte[] DatasToWrite = new byte[] { DataToSend };                                               //数据包
                if (serialPort1.IsOpen)
                {
                    try
                    {
                        MyPort.Write(DatasToWrite, 0, 1);                                                  //发数据
                        timer1.Interval = 3 * 1000;                                                        //设定超时时间
                        timer1.Start();                                                                    //定时器
                    }
                    catch
                    {
                        MessageBox.Show("串口数据写入错误", "错误");
                    }
                }
            }
    
            private void Button_Click(object sender, EventArgs e)                                         //三个按键共用一个处理函数
            {
                Button MyButton = (Button)sender;                                                         //通过tag属性来区分
                DataSended = Convert.ToByte(MyButton.Tag);
                SendDataToSerialPort(serialPort1, DataToSend[DataSended - 1]);                             //发数据
            }
    
            private void timer1_Tick(object sender, EventArgs e)                                          //定时器事件
            {
                string MyStr = DataSended.ToString() + "路数据校验超时,请检查";                          //Messagebox内容 
                timer1.Stop();
                MessageBox.Show(MyStr, "错误");
            }
    
        }
    }
  • 相关阅读:
    随手记十——淘宝静态页面
    随手记九——溢出文字处理、背景图片填充、图片代替文字
    随手记八——关于伪元素和仿淘宝导航栏
    随手记七——关于float的一个上节没明白的问题
    随手记六——两个经典BUG和bfc
    随手记五——盒子模型和层模型
    随手记四——一些课堂笔记和小技巧、总结
    随手记三——理解相邻兄弟选择器的辛酸过程
    随手记二——CSS样式和选择器
    jQuery实现手风琴效果
  • 原文地址:https://www.cnblogs.com/JasperZhao/p/16218510.html
Copyright © 2020-2023  润新知