C#上位机设计项目实战——01 串口数据发送【带校验】

串口数据发送(带数据校验)

  1. 界面设计在这里插入图片描述
  2. 上位机&下位机 (注意点)
    在这里插入图片描述
  3. 详细代码
    ①初始化&定义
 //定义 DataSended 确定是那个按钮
 //定义 DataToSend 存放定义好的协议数据
        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;
                    break;
                case 2:
                    ovalShape2.FillColor = Color.Green;
                    break;
                case 3:
                    ovalShape3.FillColor = Color.Green;
                    break;
                default:
                    break;
            }
        }

③打开/关闭串口函数

//****************************************************************//
        //打开串口/关闭串口按钮
        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 SerialPortDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte DataReceived = (byte)(~serialPort1.ReadByte());    //因为单片机传回来带符号,所以(byte)强制转换
            try
            {
                timer1.Stop();                   //收到了就 关定时器
            }
            catch
            {  }
      
            if (DataSended == 0)                //防止下位机乱发,不处理
                return;

            SetOvlShape(DataReceived);

            try
            {
                if (DataToSend[DataSended - 1] == DataReceived)     //校验数据相等
                {
                    MessageBox.Show("数据校验成功", "成功!");      //弹出提示
                }
                else
                {
                    MessageBox.Show("数据校验失败", "数据校验失败");
                }
            }
            catch
            {

            }
        }

⑤串口发送数据函数定义

  //*********************************************************************************//
        //定义 串口发送事件 函数
        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属性来区分sender
            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, "错误");
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
注:参考Doyoung 工作室c#学习教程,学习笔记
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值