用Django写网页通过tcp—client,接收单片机所发的数据,进行数据处理后绘图展示。

        暑假的时候老师布置了一个作业,使用STM32f103c8t6制作简易示波器将波形检测后上传到网页进行描点绘图,这个小项目是我和同学一起完成的,我是负责网页的那一部分,我同学则是负责硬件部分。

        附带网址:基于STM32的ESP8266WiFi模块波形检测仪

        我是用Django为框架进行网页的编写。因为要绘图,所以要涉及到Echarts。

        有关于Echarts可以进入官网进行了解:Echarts官网

        下面是我的html代码

<script type="text/javascript" src="{% static 'echarts.js' %}"></script>引入E charts
<script type="text/javascript" src="{% static 'jquery.js' %}"></script>
<div class="box1"></div>
<script>
        var myChart = echarts.init(document.querySelector(".box1"));
        //var shuju=[1,2,3,45,6,4,10000]
    	function printf() {
            $.getJSON('http://127.0.0.1:8000/text/shujuku/', function (context) {
                shuju = context['date'];
                {#console.log(shuju);#}
            })
             {#console.log("======"+shuju)#}
        //3.初始化实例对象 echarts.init(dom容器)

        //4.指定配置项和数据
        var option = {
            title: {
                text: '电压'
            },
            xAxis: {
                boundaryGap: true,// 刻度离纵轴有无间隙,默认true有间距
                type: 'category',//'value' 数值轴,适用于连续数据。 'category' 类目轴,适用于离散的类目数据,为该类型时必须通过 data 设置类目数据。
                // 'time' 时间轴,适用于连续的时序数据,与数值轴相比时间轴带有时间的格式化,
                // 在刻度计算上也有所不同,例如会根据跨度的范围来决定使用月,星期,日还是小时范围的刻度。 'log' 对数轴。适用于对数数据。
                name: '  ',// 横轴名称
                nameTextStyle: {// 名称样式
                fontSize:15,
                color:'#333',
                fontWeight: 'bold'
                },
                axisLabel : {//坐标轴刻度标签的相关设置。如果这个字段不设置,echarts会根据屏宽及横坐标数据自动给出间隔
                // clickable:true,//并给图表添加单击事件  根据返回值判断点击的是哪里
                interval: 0,// 间隔长度,可自定义(如果是时间格式,echarts会自动处理)
                rotate: 40,// 文字倾斜度
                },
                data: ['  ', '  ', '  ','  ','  ','  ','  ', '  ', '  ', '  ','  ', '  ', '  ','  ','  ','  ','  ', '  ', '  ', '  ','  ', '  ', '  ','  ','  ','  ','  ', '  ', '  ', '  ','  ', '  ', '  ','  ','  ','  ','  ', '  ', '  ', '  ','  ', '  ', '  ','  ','  ','  ','  ', '  ', '  ', '  ',
                        '  ', '  ', '  ','  ','  ','  ','  ', '  ', '  ', '  ','  ', '  ', '  ','  ','  ','  ','  ', '  ', '  ', '  ','  ', '  ', '  ','  ','  ','  ','  ', '  ', '  ', '  ','  ', '  ', '  ','  ','  ','  ','  ', '  ', '  ', '  ','  ', '  ', '  ','  ','  ','  ','  ', '  ', '  ', '  ',],// 横轴坐标值
                splitLine: {show: false},// 显示隐藏刻度线
            },
            yAxis: {
                type: 'value'
            },
            series: [{
                name:"电压",
                type: 'line',
                data: shuju,//[1, 23, 45, 5, 69, 69, 69, 69, 69],
                smooth:true,
            }]
        };
            myChart.setOption(option);
            window.addEventListener("resize", function() {
            // 让我们的图表调用 resize这个方法
            myChart.resize();
            });
        }
         var time1 = setInterval(function () {
                printf();

            }, 1000);
            clearInterval(function () {
                time1;
            })

</script>

        views视图函数代码

def sendtohtml():
    n = 1
    while n == 1:
        tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        tcp_socket.connect(('192.168.4.1', 8888))
        print("连接成功")
        recv_data = tcp_socket.recv(1024)
        if n == 1:
            print("接收到数据:")
            date = []
            for i in recv_data.decode("utf-8"):
                date = date+[i]
                if len(date) > 3:
                    date = date[0]+date[1]+date[2]+date[3]
                    msg = ChartModel()
                    msg.c_time = date
                    msg.save()
                    print(msg.c_time)
                    date = []
            data_list = []
            time1 = ChartModel.objects.all()
            for a in time1:
                data_list = data_list + [a.c_time]
            if len(data_list) > 100:
                for c in range(25):
                    ChartModel.objects.all().first().delete()
            tcp_socket.close(),
            time.sleep(0.1)
            continue

    return HttpResponse()

def shujuku(request):
    data_list = []
    time1 = ChartModel.objects.all()
    for a in time1:
        data_list = data_list+[a.c_time]
    context = {
        'date': data_list,
    }
    return JsonResponse(data=context)

def send(request):
    t = threading.Thread(target=sendtohtml)  #双线程
    t.start()

    return render(request,'tubiao1.html')

        接下来我会解释一下视图函数里面的代码

        第一个sendtohtml(),这个函数主要是进行数据的接受和数据的处理,因为我们所接受到的数据是一串串字符串,并不是我们想要的数据,所以只能对这些数据进行数据处理,当我们把数据处理完之后,我们就把数据存进我们的数据库里面,当我们所存进的数据达到一定的量的时候,我们就会把多出来的数据进行删除。

        第二个shujuku(request),这个函数是把数据库里面的数据一个个提取出来,之后发送到网页端,网页再把数据绘成图展示出来。

        第三个send(request),这个函数的作用是对函数sendtohtml()进行引用,最后的再返回网页。

        下面的是我的model代码

class ChartModel(models.Model):
    c_time = models.CharField(max_length=16,unique=False)
    class Meta:
        db_table = 'Chart'

        这个代码只是单纯的创建一个数据库进行数据存储。

        这些代码组合在一起就能实现数据的接收和绘图。

 

        作者本人学代码是断断续续的学了一年,这是本人的第一个博客,语言有可能不通顺,当然代码也不一定是最好的,若有错误之处,望各位大佬赐教。

  • 8
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值