zoukankan      html  css  js  c++  java
  • 串口通信 数据抽象

    1、应答式,主机主动发起请求从机响应的方式,解决从机无序应答。

      解决丢帧或帧错误,如果从机未响应,尝试计数器:com->tx_retry会计数,在尝试 SCOM_4_TX_RETRY 后仍未响应,拆除请求数据帧。

    2、栈式缓冲,解决业务数据不能及时响应时,不丢失云端业务数据。

      做法:将需要请求的帧,存放不同的缓冲栈,com->TxBuf[SCOM_4_TX_STACK][SCOM_4_TX_BUF_LEN]

      入栈:目标栈计算:dst_stk = com->tx_stk_cur + com->tx_stk_cnt;

    3、帧协议可以传输文件,要求:a)文件传输必须快,2) 不能影响正常的业务信息

      解决方式:1)文件在每一帧的空闲位置传送,帧的最大容量为 SCOM_4_TX_BUF_LEN

            2)保证文件的立即快速传送

           3)不另起帧专门传递文件数据,采用将文件数据插入到业务帧&心跳包的空闲空间

    综上:a) 栈式分布是缓冲,避免主机请求阻塞时的处理  b) 应答式避免从机无序响应

      注意:1) 虽然分布式缓冲解决了主机阻塞时的缓冲处理,但同一时刻只有一个数据帧等待响应(com->tx_stk_cur ),响应后将立即拆除缓冲栈的数据帧

         2) 由于是应答式,所以从机注意接收到有效帧后必须及时应答,尽量避免主机重发数据帧。

           3) 处理数据包的频率 SCOM_4_Process(),一定要高于发送心跳包的频率,否则会人为的阻塞缓冲栈。

    数据抽象:

    typedef struct
    {
        CWnd*                m_pOwner;
        void                *udat;
        f_Com4Cb            msg_callback;                        //串口发送,串口接收数据处理
        f_Com4Ex            exd_callback;
        S_Com4Tsk            *task;
        unsigned short         rx_pos;                                //分析接收栈的位置指示器
        unsigned char         tx_retry;                            //应答重试次数计数器,无应答重复发送相同帧次数
        unsigned char         tx_sem;                                //计数字节,每发送一帧数据+1
        unsigned short         tx_tick;                            //发送数据帧的时间间隔,SCOM_4_BIT_CYCLE*主循环时间
        unsigned char         tx_stk_cnt;                            //待发送栈的数量,总共有SCOM_4_TX_STACK,超过后不允许打包数据
        unsigned char         tx_stk_cur;                            //当前正在等待处理的栈,即当前栈需要等待接收应答
        unsigned char         TxBuf[SCOM_4_TX_STACK][SCOM_4_TX_BUF_LEN];//栈发送数据实例
        unsigned int        TxLen[SCOM_4_TX_STACK];                //每个栈待发送数据的长度
        unsigned char        TxSem[SCOM_4_TX_STACK];                //每个栈的计数字节
        unsigned char         RxBuf[SCOM_4_RX_BUF_LEN];            //接收BUF
        //extra data transmit function
    #ifdef SCOM_4_MASTER
        unsigned char         PadBuf[SCOM_4_TX_BUF_LEN];
    #endif
        unsigned short        ex_fun;                                //文件任务是否停止指示器,如果文件未发送完成,应立即发送
        unsigned char        ex_cmd;                                //文件传输状态命令字
        unsigned char        ex_typ;
        unsigned int        ex_len;                                //发送文件的总长度
        unsigned int        ex_ptr;                                //已发送文件长度,未发送文件的起始位置
        unsigned char        *ex_str;
        unsigned char        crc64[8];
    } S_Com4hd;

    源码使用说明

    (1)     ScCom_4.c文件提供了以下3个API接口函数:

    ① int SCOM_4_Init(S_Com4hd* com, f_Com4Cb Cb, f_Com4Ex ex, void *uDat)

    协议初始化,在开始通信前调用一次(一般为应用程序启动时),用于初始化协议资源,其参数定义如下:

    参数1:协议句柄,需传入一个S_Com4hd类型的变量实体的地址。

    参数2:通信回调函数,用于数据交换及通知。

    参数3:数据传输回调函数,用于OTA数据传输,不使用可传空。

    参数4:用户变量指针,不用可传空。

    ② void SCOM_4_Process(S_Com4hd* com, int txc)

    协议周期处理,需周期调用,建议调用周期不大于100ms,该函数会周期性读取串口数据并解析出有效的数据包,当收到有效数据包时通过回调函数通知应用程序,这意味着调用频率越高,响应越迅速,其参数定义如下:

    参数1:协议句柄。

    参数2:不使用,传空即可。

    ③ int SCOM_4_SendPack(S_Com4hd* com, unsigned char* msg, unsigned short len)

    数据包发送,当收到显示屏发来的数据包后调用该函数进行回复,其参数定义如下:

    参数1:协议句柄。

    参数2:数据内容。

    参数3:数据长度。

     

    (2)     通过SCOM_4_Init设置的通信回调函数MSG_Callback可按照如下定义:

       

    该回调函数用于串口数据交换及数据包通知,使用时需要填入以下接口:

    ① 串口发送回调,通过串口发送长度为len的数据缓冲msg

    ② 串口接收回调,通过串口读取数据到msg,并返回读取长度len

    ③ 串口同步回调,用于串口收发同步,避免冲突,正常可不填

    ④ 收到命令回调,cmd为命令,msg为命令内容,内容度为len

    (3)     OTA数据接收,通过SCOM_4_Init设置的通信回调函数EXD_Callback可按照如下定义:

       

    该回调函数用于接收OTA数据,提供了以下接口:

    ⑤ 开始数据传输,用于启动接收流程(如打开文件)

    ⑥ 数据段传输,用于接收一段数据流(如写入文件)

    ⑦ 数据传输完成,用于结束接收流程(如关闭文件)

    ⑧ 数据传输复位,用于重置接收流程(一般不用)

    (4)     数据解析与回复

    ① 从命令回调里直接取出命令内容进行解析。

    ② 每收到一帧数据包必须进行回复,可直接在命令回调里进行回复(直接调用SendPack函数对要发送的数据进行打包并发送)

    协议:

      

    备注:

      所有数据高字节在前,低字节在后

      计数值:逐帧递增,可通过计数值判断是否有丢帧,或者是否是重复发送的帧。

    心跳及状态

    命令: 0xA0

    ANDRIOD -> 设备:

    Byte

    11

    12

    13

    14

    15

    16

    17

    18,19

    内容

    联网状态

    设备控制字

    备注

     

     

     

     

     

     

    0/1

    2字节

    设备 -> ANDRIOD:

    Byte

    11~14

    15~30

    31~46

    内容

    产品id

    产品key

    故障字

    备注

    4字节

    16字节

    16字节(128位)

    Byte

    47~54

    55

    56

    57~72

    内容

    停售指令

    故障指令

    设备状态

    版本号

    备注

    8字节(64位)

     

     

    16字节

     

    Byte

    73

    74

    75

    76

    77

    ...

    77+n*2

    78+n*2

    内容

    设备操作码

    制作进度

    状态1

    ...

    状态n

    备注

    2字节

    1字节

    2字节

    ...

    2字节

     

    备注:

    (1)产品id和产品key在平台获取。

    (2)设备控制字,SDT07对设备的全局控制参数。

    (3)故障字和故障指令:

    故障字共16字节,128位,毎1位代表一种故障,全部为0时表示无故障。平台最多支持定义128种故障,定义好故障后,发生故障时,平台可以解析并显示发生的故障,生成相应的维保工单。

    故障指令可取值:

    0 - 无故障操作。

    1 - 预警,屏幕不提示,不影响售卖,仅上报平台产生维保工单。

    2 - 可自动恢复故障,屏幕跳转至故障页面,停止售卖,故障消失即可恢复售卖。

    3 - 不可自动恢复故障,屏幕跳转至故障页面,停止售卖,即使故障消失也不能恢复售卖,需要重新上电。

    4 - 严重故障,需要厂商到场输入密码解锁。

    当故障字和故障指令均不为0时,屏幕执行故障指令对应的操作。

    (4)停售指令:8字节,64位,每一位表示停售某一类商品,全部置1,则设备停售所有商品。平台上最多可定义64个商品种类。

    (5)设备状态:

                  0 - 设备启动中

                  1 - 设备空闲

                  2 - 设备正在制作商品

    (6)设备操作码,可以是设备端的按键操作的键值。

    (7)制作进度,0~100。

    (8)状态1~n在平台上定义,定义完成后,平台上可解析并显示设备的状态;

    (9)每个状态数据均占用2字节;

    (10)心跳包间隔500ms;

    (11)状态数据毎30s发送至云端一次。

  • 相关阅读:
    QTableWidget清空
    SQLite查询表是否存在
    QSplitter测试
    Qto_CoveringBaseQuantities
    osg旋转
    Qto_CurtainWallQuantities
    没有理清的一段代码
    方块
    Qto_DoorBaseQuantities
    全微分在近似计算中的应用
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/10135859.html
Copyright © 2011-2022 走看看