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, "错误");
        }

    }
}

 

posted @ 2022-05-03 15:37  Jasper2003  阅读(276)  评论(0编辑  收藏  举报