怎么做一个数据采集程序

怎么做一个数据采集程序,第1张

楼主,我的思路是这样的:1、比如你的原始数据存放在DB2.DBD0里面,每个周期累加这个原始数据,并保存到DB2.DBD4里面;2、同时对累加次数计数,计数结果存放在DB2.DBD8里面;3、等1s循环时间中断OB3x事件到来时,在这个OB3x里面,用DB2.DBD4除以DB2.DBD8,这个平均值放入DB2.DBD12里面(这就是你需要的1s后数据采集的平均值);4、然后在OB3x里面清空累计数据、累计次数。呵呵......周而复始如此这般执行,应该能满足楼主的要求!按照上面的思路写了点代码给楼主参考(本人没有测试,楼主可以测试一下):

作者以前开发设计采集器参考了 Google 的那套设计思路。这套设计方式基本都能满足分析需求,如果要区分用户和用户行为,采集的数据模型需要开发跟数据同学约定好。

本篇讲解的采集器,需求来源于用户行为分析平台,数据模型是固定的,设计思路会有些不同。

说明

数据采集后,数据分析(机器学习)专家一般会对数据进行筛选、降维、建模。这个过程中数据筛选是花费最多的环节,所以在采集数据的环节,我们有必要定义好一定的数据规则(模型),在数据源头上,让采集器做更多的工作,减少数据筛选的工作量。这里扩展一下,当前工业上比较流行的机器学习库 TensorFlow 出了个 JS 版本,官方针对微信小程序开发了一套小程序插件 tfjs-wechat ,大家可以尝试一下,说不定可以让采集器智能化。

对于采集分析用户行为的数据,我们先从采集器使用的数据模型开始讲起。

当前数据分析平台的数据模型由两块组成:用户属性和用户事件。

用户属性

用户属性指的是:用户 id、年龄、姓名、性别、所在的地区、首次注册时间、vip 等。

用户事件

用户事件指的是:用户在小程序上做了什么 *** 作,比如点击了购买按钮这个行为事件,访问了某个页面。

模型:

内置事件

内置事件指的是采集器自动处理上报的事件,分为两类。

自定义事件

自定义事件指的是用户自己设置的事件,通过调用采集器的 API 上报事件。比如:上报一个点击购买按钮的用户行为事件, sdk.track ("buy", {price: '¥10'}) , 其中事件名是 "buy",事件属性是 "price"。

用户内置属性

用户内置属性指的是平台内置的用户属性字段,通过调用采集器封装好的 API,传入属性值上报。比如:realName(姓名)、age(年龄)、city(城市)、country(国家)、$gender(性别)等。

用户自定义属性

用户自定义属性指的是用户自定义的用户属性字段, 通过调用采集器的 API,传入属性字段以及值。

先上模块关系图:

直接上参考程序:

Dim av As Variant

Dim datacount As Long

Private Sub cmdClear_Click()

    txtData.Text = ""

End Sub

Private Sub cmdStop_Click()

   

    '关闭端口

    If MSComm.PortOpen = True Then

        MSComm.InBufferCount = 0    '清空缓冲区

        MSComm.PortOpen = False

    End If

   

    cmdReceive.Enabled = True

    lblStatus.Caption = "停止接收,空闲"

   

End Sub

Private Sub cmdReceive_Click()

   

    '串口设置

    With MSComm

        .CommPort = 1

        .Settings = "9600,N,8,1"

        .RThreshold = 1         '接收1字节触发oncomm事件

        .InputMode = comInputModeBinary

        .InputLen = 1           '输入长度为1

        .InBufferCount = 0      '清除接收缓冲区

    End With

    '打开端口

    If MSComm.PortOpen = False Then

        MSComm.PortOpen = True

        If Err Then

            MsgBox (Err.Description)

            Exit Sub

        End If

    End If

        

    lblStatus.Caption = "打开端口,等待接收"

    datacount = 0

    cmdReceive.Enabled = False

End Sub

Private Sub cmdSave_Click()

    Dim outfn As String

    MsgBox ("接收了" + CStr(datacount) + "组数据")

    lblStatus.Caption = "接收完成,请选择输出文件"

   

    cmdReceive.Enabled = True

   

    '选择输出文件

    CommonDialog1.FileName = CStr(Date) + ".txt"

    CommonDialog1.Filter = "Text Files|*.txt"

    CommonDialog1.Flags = CommonDialog1.Flags Or cdlOFNOverwritePrompt

    CommonDialog1.CancelError = True

    On Error GoTo errhandler

        CommonDialog1.ShowSave

        outfn = CommonDialog1.FileName

        

        Open outfn For Output As #1

            Print #1, txtData.Text

        Close #1

   

    'txtData.SaveFile outfn

    lblStatus.Caption = "输出完成,空闲"

   

errhandler:

    Exit Sub

End Sub

Private Sub Form_Load()

    lblStatus.Caption = "空闲"

End Sub

Private Sub Form_Unload(Cancel As Integer)

    '关闭端口

    If MSComm.PortOpen = True Then

        MSComm.InBufferCount = 0    '清空缓冲区

        MSComm.PortOpen = False

    End If

   

End Sub

Private Sub MSComm_OnComm()

    Dim T1, T2 As Long

    Select Case MSComm.CommEvent

   

        Case comEvReceive       '收到Rthreshold个字节产生的接收事件

           

            MSComm.RThreshold = 0    '关闭OnComm事件接收

            lblStatus.Caption = "接收"

            av = MSComm.Input       '读取一个接收字节

            dataframe(1) = av(0)    '转换为字节

           

            If dataframe(1) = &HA Then   '接收到T1

               

                Do

                    DoEvents

                Loop Until MSComm.InBufferCount >= 2  '循环等待接收缓冲区>=2个字节

               

                av = MSComm.Input

                dataframe(2) = av(0)

                av = MSComm.Input

                dataframe(3) = av(0)       '接收T1

                T1 = dataframe(2) + CLng(dataframe(3)) * 256    '计算T1

            End If

           

            Do

                DoEvents

            Loop Until MSComm.InBufferCount >= 1  '循环等待接收缓冲区>=1个字节

            av = MSComm.Input       '读取一个接收字节

            dataframe(4) = av(0)    '转换为字节

           

            '接收到T2

            If dataframe(4) = &HA0 Then

                'MSComm.RThreshold = 0     '关闭OnComm事件接收

               

                '循环等待接收缓冲区>=2个字节

                Do

                    DoEvents

                Loop Until MSComm.InBufferCount >= 2

               

                av = MSComm.Input

                dataframe(5) = av(0)

                av = MSComm.Input

                dataframe(6) = av(0)       '接收T2

                T2 = dataframe(5) + CLng(dataframe(6)) * 256    '计算T2

               

                '显示T1 T2 enter

                txtData.Text = txtData.Text + CStr(T1) + " " + CStr(T2) + Chr(&HD) + Chr(&HA)

               

                datacount = datacount + 1   '数据组数+1

            End If

           

            MSComm.RThreshold = 1       '打开OnComm事件接收

           

        Case Else

        

    End Select

   

End Sub

RS232串行通信的波特率设为9600,8位数据位,一位停止位,无校验位。

2. 每组数据包含T1(16位)和T2(16位),将每个数据分成2个8位的数据,先是低8位,然后是高8位。数据为无符号整型。

   先发T1,然后发T2,然后是下一组T1、T2。

   T1以头数据0x0A(16进制,10进制位10)为头字节,然后是T1的低8位,T1的高8位。

   T2以头数据0xA0(16进制,10进制位160)为头字节,然后是T2的低8位,T2的高8位。

   发送时序举例:0x0A, t1低8位,t1高8位,0xA0, t2低8位,t2高8位……

   将收到的数据T1、T2的高低8位合并,转换成10进制数,以每行T1 T2的形式存储到txt文本文件中

如果需要 做其他‘文件格式的处理, 数据已经拿到了,想怎么弄就变通下吧。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11507110.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存