⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart_comm.h

📁 自己的小作,能简化繁琐的通讯帧格式的检测工作,在常量数组 PROTOCOL_ARRAY 中定义一个或多个通讯帧格式,能同时将多个有效帧检测出来,采样队列的方式,高效.
💻 H
字号:
/******************************************************************************
 Copyright (C) R&D Institute of Holley Group Co., Ltd.
 Module:
 FileName:  
 Author:jerry chen              
 Version :1.0          
 Date:2005-12-16
 Description:
 ------------------------------------------------------------------------------
 Modification History:
 <No.>     	<time>        		<author>     		<version >   	<contents> 
  1、    	2005-12-24    		Jerry.chen    	    1.0             build this moudle   
********************************************************************************/
/*-----------------------------------------------------------------------------*/


#ifndef  uart_comm_h
#define  uart_comm_h

    /********************************/
    /*           宏定义             */
    /********************************/
    #define     UART0_REC_MAX	150	
    #define     UART0_TRS_MAX	150	
    /********************************/
    /*         数据类型定义         */
    /********************************/

    // 串口设置结构体寄存器
    typedef struct {                       
        uint16  baudrate_gene;      // baudrate = baudrate_id*300; example: 1-300 bps, 2-600 bps, 4-1200 bps, 8-2400 bps, 16-4800 bps, 32-9600 bps, 64-19600 bps, 128-38400 bps, 256-76800, 384-115200;                
        uint8   data_bit;           // 5, 6, 7, 8;   
        uint8   stop_bit;           // 2-one stop bit, 3-1.5 stop bit, 4-2 stop bit;    
        uint8   bit_check;          // 0-none, 1-odd, 2-even;       
    }UART_OP;
    #define UART_OP_TYPE_LONG     sizeof(UART_OP)

    // 通讯状态结构体寄存器
    typedef struct {                       
        uint8   *tx_buff;           // 发送缓冲区指针           
        uint8   comm_cnt;           // 当前操作计数器,为当前发送字符在数组中的偏移量  
        uint8   rtx_num;             // 所要发送的字节总数(发送时有效)  
        struct                      // 操作状态寄存器,当接收时有用     
        {
	        unsigned	pe_flag:1;  // check err        接收时有效
    		unsigned	oe_flag:1;  // overflow err     接收时有效
    		unsigned	fe_flag:1;  // frame err        接收时有效
    		unsigned	foe_flag:1; // frame overflow  err  接收时有效
    		unsigned	tx_finish_flag:1;   //          发送时有效
    		//unsigned	rx_timeov_flag:1;   //          接收时有效
    		

		    unsigned 	no_use :3;          
        } lsr_status ;                      //以上标志位的事件发生时 标志置位
    }COMM_STATUS;

    //串口通讯接收队列数据结构
    #define COM_QUE_MAX             160     //队列长度
    typedef struct {                       
        uint8   queue[COM_QUE_MAX];     // 队列                
        uint8   head;                   // 队列入口,指向最后进入队列的数据   
        uint8   trail;                  // 队列出口,指向最早进入队列的数据,当队列长度为1时:trail=head;长度为0 时:trail=head+1;    
        uint8   que_long;               // 队列实际的数据长度    
    }COMM_QUEUE_TYPE;

    ////////////////////////////////////////////////////////
    //关键字 数据结构
    typedef struct {                       
        uint8   type;                   // 关键字类型决定KEY 域的处理办法,0: 普通关键字;1:关键字的偏移指针,如数据域/帧 长度.               
        uint8   offset;                 // 关键字在整帧中的偏移量 或 关键字偏移指针.
        uint8   key;                    // 关键字   
         int8   key_point_add;          // 关键字偏移指针矫正量,关键字的实际位置= *关键字偏移指针 + key_point_add;  
        uint8   key_point_max;          // 关键字偏移指针的最大值,对帧长或数据域长度进行限制,以免无限制等待.    
    }JUDGE_KEY_TYPE;

    //帧格式 数据结构
    typedef struct {                       
        uint8           level_num;      // 检测的关键字总级数.               
        JUDGE_KEY_TYPE  key_array[6];   // 关键字检测数组
    }FRAME_FORMAT_TYPE;

    //单帧检测 操作状态结构
    typedef struct {                       
        uint8   level;      			// 当前协议的帧格式检测的级数,0:第一个关键字判断未通过,1:通过第一个关键字判断;                
        uint8	frame_start; 			// 通过的第一个关键字的位置(通常也就是帧首的位置);
        uint8	valid;					// 帧有效,通过了所有关键字的判断,等待协议解释.
    }SINGLE_FRAME_DET_TYPE;


	#define	PROTOCOL_MAX		1		// 参加帧格式检测的协议的个数.
    //多协议帧检测 操作状态结构
    typedef struct {                       
        uint8   				detected_positon;      		// 当前协议的帧格式检测的级数,0:第一个关键字判断未通过,1:通过第一个关键字判断;                
        uint8					valid_que_trail; 			// 通过的第一个关键字的位置(通常也就是帧首的位置,是frame_det.frame_start 的最大值);
        SINGLE_FRAME_DET_TYPE	frame_det[PROTOCOL_MAX];	// 帧有效,通过了所有关键字的判断,等待协议解释.
    }MULTI_FRAME_DET_TYPE;


    /********************************/
    /*          变量定义            */
    /********************************/
    extern  volatile    uint8           uart0_dlm,uart0_dll;
    extern  volatile    UART_OP         uart0_option;
    extern  volatile    COMM_STATUS     uart0_rec;
    extern  volatile    COMM_STATUS     uart0_trs;
    extern  volatile    COMM_QUEUE_TYPE uart0_rec_que;
    extern  volatile    MULTI_FRAME_DET_TYPE	multi_frame_det;    
    /********************************/
    /*          函数声明            */
    /********************************/
    extern uint8    fmt_uart0(void);
    extern void     UART0_SendStr(uint8 *str,uint8 send_num);
    extern void     __irq uart0_isr (void);
    extern void     uart0_tx_test (void);
    extern void     uart0_send_irq (uint8 *buff_point, uint8 send_num );












#endif


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -