cc2530入门教程-增强版基础技能综合实训案例(基础版)-上位机源码

一只爱蜜蜂的小学习 一只爱蜜蜂的小学习     2022-09-11     177

关键词:

【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-上位机源码

广东职业技术学院  欧浩源

一、需求分析

        按照指定参数打开串口,与测控终端建立数据传输通道,并根据应用要求实现程序逻辑,具体需求详见《【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-题目需求》。

二、界面设计

三、程序源码分析

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.IO.Ports;

namespace 基础技能综合实训_基础版_
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        SerialPort com = new SerialPort();          //实例化一个串口对象 
        byte[] SendData = new byte[8];              //定义一个8字节的发送数据缓存
        byte[] readBuffer = new byte[8];            //实例化接收串口数据的数组
        private void Form1_Load(object sender, EventArgs e)
        {
            string[] ports = { "COM1", "COM2", "COM3", "COM4", "COM5" };
            foreach (string str in ports)
            {
                comboBox1.Items.Add(str);
            }
            comboBox1.SelectedIndex = 2;
            string[] baudrate = { "2400", "4800", "9600", "19200", "57600", "115200" };
            foreach (string str in baudrate)
            {
                comboBox2.Items.Add(str);
            }
            comboBox2.SelectedIndex = 2;
            comboBox3.Items.Add("6");
            comboBox3.Items.Add("7");
            comboBox3.Items.Add("8");
            comboBox3.SelectedIndex = 2;
            comboBox4.Items.Add("1");
            comboBox4.Items.Add("1.5");
            comboBox4.Items.Add("2");
            comboBox4.SelectedIndex = 0;
            comboBox5.Items.Add("None");
            comboBox5.SelectedIndex = 0;

            button2.Enabled = false;
            button3.Enabled = false;
            button4.Enabled = false;
            textBox1.ReadOnly = true;
            label14.Text = "终端未连接";
            label14.ForeColor = Color.Red;
            label9.Text = "0.00" + " V";
            label9.ForeColor = Color.Blue;
            label12.Text = "";
            label13.Text = "";
            label7.Text = "串口未连接!";
            label7.ForeColor = Color.Red;

            com.ReceivedBytesThreshold = 8;   //设置串口接收到8个字节数据才触发DataReceived事件
            //为串口DataReceived事件添加处理方法
            com.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
        }

        //串口数据接收DataReceived事件触发处理方法
        private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
        {

            string strRcv = "";
            int count = com.BytesToRead;                    //获取串口缓冲器的字节数
            if (count != 8)
            {
                return;
            }
            com.Read(readBuffer, 0, 8);                     //从串口缓冲区读出数据到数组
            com.DiscardInBuffer();

            for (int i = 0; i < readBuffer.Length; i++)
            {
                strRcv += readBuffer[i].ToString("X2") + " ";   //16进制显示  
            }
            this.BeginInvoke(new Action(() =>
            {
                textBox1.Text = strRcv;
            }));

            if (readBuffer[0] == 0xAF && readBuffer[7] == 0xFA) //判断数据的帧头和帧尾
            {
                this.BeginInvoke(new Action(() =>
                {
                    switch (readBuffer[2])
                    {
                        case 0x10:
                            label14.Text = string.Format("{0}号终端在线", readBuffer[1]);
                            label14.ForeColor = Color.Green;
                            button4.Enabled = false;
                            button2.Enabled = true;
                            button3.Text = "打开照明灯";
                            button2.Text = "开始采集数据";
                            label12.Text = "关闭";
                            label12.ForeColor = Color.Red;
                            label13.Text = "关闭";
                            label13.ForeColor = Color.Red;
                            break;
                        case 0x11:
                            Int32 ad = readBuffer[3];
                            double advalue;
                            ad <<= 8;
                            ad |= readBuffer[4];                            //从数据帧中将电压数据取出
                            advalue = ad;
                            advalue = (advalue * 3.3) / 32768;              //将数据换算为实际的电压值
                            label9.Text = advalue.ToString("F2") + " V";
                            if ((readBuffer[5] & 0x01) == 0x01)
                            {
                                label12.Text = "打开";
                                label12.ForeColor = Color.Blue;
                                button3.Text = "关闭照明灯";
                            }
                            else
                            {
                                label12.Text = "关闭";
                                label12.ForeColor = Color.Red;
                                button3.Text = "打开照明灯";
                            }
                            if ((readBuffer[5] & 0x02) == 0x02)
                            {
                                label13.Text = "打开";
                                label13.ForeColor = Color.Blue;
                            }
                            else
                            {
                                label13.Text = "关闭";
                                label13.ForeColor = Color.Red;
                            }
                            break;
                        case 0x1f:
                            label14.Text = "现场报警!!!";
                            label14.ForeColor = Color.Red;
                            button4.Enabled = true;
                            button2.Enabled = false;
                            button3.Enabled = false;
                            break;
                      }
                   // com.DiscardInBuffer();
                }));   
            }
        }
          
        private void button1_Click(object sender, EventArgs e)
        {
            if (button1.Text == "打开串口")
            {
                com.PortName = comboBox1.Text;                      //选择串口号
                com.BaudRate = int.Parse(comboBox2.Text);           //选择波特率
                com.DataBits = int.Parse(comboBox3.Text);           //选择数据位数
                com.StopBits = (StopBits)int.Parse(comboBox4.Text); //选择停止位数
                com.Parity = Parity.None;                           //选择是否奇偶校验
                try
                {
                    if (com.IsOpen)                                 //判断该串口是否已打开
                    {
                        com.Close();
                        com.Open();
                    }
                    else
                    {
                        com.Open();
                    }
                    label7.Text = "串口已成功连接!";
                    label7.ForeColor = Color.Blue;
                }
                catch (Exception ex)
                {
                    MessageBox.ReferenceEquals("错误:" + ex.Message, "串口通信");
                }
                button1.Text = "关闭串口";
            }
            else if (button1.Text == "关闭串口")
            {
                com.Close();                        //关闭串口
                label7.Text = "串口未连接!";
                label14.Text = "终端未连接";
                label14.ForeColor = Color.Red;
                label7.ForeColor = Color.Red;
                button1.Text = "打开串口";
                button2.Enabled = false;
                button3.Enabled = false;
                button4.Enabled = false;
                textBox1.Clear();
            }
        }

        private void SendUartData()
        {
            SendData[0] = 0xAF;
            SendData[3] = 0x00;
            SendData[4] = 0x00;
            SendData[5] = 0x00;
            SendData[6] = 0x00;
            SendData[7] = 0xFA;
            for (int i = 1; i < 7; i++)
            {
                SendData[6] += SendData[i];
            }
            com.Write(SendData, 0, 8);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (button2.Text == "开始采集数据")
            {
                button2.Text = "停止采集数据";
                button3.Enabled = true;
                SendData[1] = 0x01;
                SendData[2] = 0x01;
                SendUartData();
            }
            else 
            {
                button2.Text = "开始采集数据";
                button3.Enabled = false;
                SendData[1] = 0x01;
                SendData[2] = 0x02;
                SendUartData();
            }
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (button3.Text == "打开照明灯")
            {
                button3.Text = "关闭照明灯";
                SendData[1] = 0x01;
                SendData[2] = 0x03;
                SendUartData();
            }
            else
            {
                button3.Text = "打开照明灯";
                SendData[1] = 0x01;
                SendData[2] = 0x04;
                SendUartData();
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            SendData[1] = 0x01;
            SendData[2] = 0x0f;
            SendUartData();
        } 
    }
}

cc2530入门教程-增强版基础技能综合实训案例(基础版)-题目需求

【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-题目需求广东职业技术学院 欧浩源一、引用  不管是简单的单片机应用,还是复杂的嵌入式系统,在我看来它们的本质结构是差不多的,都离不开“内核+外... 查看详情

cc2530强化实训03定时器间隔定时实现按键n连击(代码片段)

...按键N连击【题目要求】   2018年全国职业院校技能大赛“物联网技术应用”国赛(高职组)中关于感知层开发的难度陡然增大,三个题目均在Zigbee协议栈下完成。其中第一个题目“仓库温湿度智能控制系统”考查了按... 查看详情

cc2530入门教程-03cc2530的中断系统及外部中断应用

第3课 CC2530的中断系统及外部中断应用广东职业技术学院 欧浩源一、中断相关的基础概念     内核与外设之间的主要交互方式有两种:轮询和中断。 轮询的方式貌似公平,但实际工作效率很低,且... 查看详情

cc2530强化实训02普通延时函数实现按键的长按与短按(代码片段)

【CC2530强化实训02】普通延时函数实现按键的长按与短按【题目要求】   用一个按键实现单击与双击的功能已经是很多嵌入式产品的常用手法。使用定时器的间隔定时来计算按键按下的时间是通用的做法,然而,使用... 查看详情

cc2530强化实训03定时器间隔定时实现按键长按与短按(代码片段)

【CC2530强化实训03】定时器间隔定时实现按键长按与短按【题目要求】   虽然用普通的延时函数能够实现按键长按与短按的判别,但是在实际的工程应用和项目开发中并不好用也不灵活。更多得是借助定时器的间隔定... 查看详情

cc2530入门教程-05cc2530的串行接口原理与应用

第5课 CC2530的串行接口原理与应用广东职业技术学院 欧浩源一、并行通信与串行通信    微控制器与外设之间的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。  &n... 查看详情

cc2530入门教程-06cc2530的adc工作原理与应用

第6课 CC2530的ADC工作原理与应用广东职业技术学院 欧浩源一、A/D转换的基本工作原理    将时间上连续变化的模拟量转化为脉冲有无的数字量,这一过程就叫做数字化,实现数字化的关键设备是ADC。  ... 查看详情

c语言学生成绩管理系统课程设计

...学科领域所覆盖及延伸的知识点应用到具体的实例当中,增强学生的动手能力、应用理论的能力以及团队协作能力,复合高职高专的培养目标,能够培养出具有实际动手能力的技能型人才。三、实施步骤与方法1.查阅资料、搜集... 查看详情

stc8051与cc2530单片机有撒不同

STC8051是MCS51为核的单片机,CC2530是以增强型8051为核心开发的的产品。这就是其本质的区别。请看百度百科给的说明:CC2530结合了领先的RF收发器的优良性能,业界标准的增强型8051CPU,系统内可编程闪存,8-KBRAM和许多其它强大的... 查看详情

cc2530学习路线-基础实验-gpio按键控制led灯亮灭(代码片段)

目录1.前期预备知识1.1新大陆Zigbee模块按键电路图1.2CC2530相关寄存器1.3CC2530中断走向图1.4使用C语言为51单片机编写中断程序1.5*函数指针2.程序代码THEEND1.前期预备知识1.1新大陆Zigbee模块按键电路图由上图可知,Zigbee模块的SW1按钮... 查看详情

cc2530学习路线-基础实验-gpio控制led灯亮灭(代码片段)

目录1.前期预备知识1.1新大陆ZigBee模块LED灯电路1.2CC2530相关寄存器1.3寄存器操作技巧1.4CPU空转延时1.4操作流程图2.程序代码TheEnd1.前期预备知识1.1新大陆ZigBee模块LED灯电路从上两的两个电路可知1.LED1连接在LED-LINK上,而LED-LINK是从CC... 查看详情

计算机实训报告范文5篇

...过上机操作形式,潜移默化地进行综合操作素质的训练,增强学生综合运用所学知识解决实际问题的能力。实训内容:word文档与e_cel表格的编辑与操作。短短三天的计算机实训结束了,通过这三天的实训,我学到了很多的知识,... 查看详情

alb技术笔记基于多线程方式的串行通信接口数据接收案例

...浩源1、案例背景    在本博客的《【CC2530入门教程-06】CC2530的ADC工作原理与应用》中实现了电压数据采集的程序设计,传感器模块以每1秒发送一帧数据的形式通过串口向上位机发送电压数据。其数据帧由4个字节组... 查看详情

html基础2——综合案例3——创建考试报名表格

1<html>23<head>4<title></title>5</head>67<body>8<tablewidth="600px"height="500px"cellspacing="0"border="1">9<tr>10<tdalign="left">姓名</td>11& 查看详情

html基础2——综合案例2——复杂的嵌套列表

1<html>23<head>4<title></title>5</head>67<body>8<ultype="disc">9<li>太阳</li>10<li>月亮</li>11<li>地球</li>12<listyle="list-s 查看详情

cc2530学习路线-基础实验-串口通讯发送字符串(4未完待续)

目录1.前期预备知识1.1串口通讯电路图1.2实验相关寄存器1.2常用波特率设置本章未完待续.....原来写的文章已经丢失了,只能找到这一小部分,看什么时候有时间再补上。1.前期预备知识1.1串口通讯电路图从上图可见,CC2530芯片通... 查看详情

cc2530属于啥单片机

...丰富(主要多了用于实现zigbee协议栈的硬件),应该属于增强型51单片机吧。https://wenku.baidu.com/view/ecfa9704bed5b9f3f90f1ce1.htmlTI官网的手册应该更好,英语好的话看那个吧参考技术A51系类单片机本回答被提问者采纳 查看详情

html基础2——综合案例1——如何用iis配置网站

 1.打开iis 如果机子上面没有iis,可以先装一个,不同的系统可能安装步骤不一样,至于iis的安装方法,大家可以去百度找找。 2.准备网站源程序 既然要配置网站,肯定要先准备好网站源程序,网站源程序可以去... 查看详情