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

📄 txdata.c

📁 uCOS在PIC芯片中的移植:以PIC24HJ64GP210为例进行uCOS在Microchip芯片中的移植
💻 C
字号:

#include <includes.h>

//#ifndef TX_DATA
//
//typedef unsigned char     INT8U;
//
////#define SOFT_CLEAR_TI //如果MCU需要软件清除字节发送结束标识位(如具有8051核的MCU),则须定义SOFT_CLEAR_TI
//#define CNT_SEND_MAX_NUM            30    //封包發送最大字節數
//#define CNT_SEND_DATA_START_BYTE    ':'    //封包起始字节
//#define CNT_SEND_DEBUG_START_BYTE   '#'    //封包起始字节
//#define CNT_SEND_END_BYTE           '\n'   //封包終止字节
//
//#endif

#define BIT_SEND_INT_FLAG            _U1TXIF   //字节發送中断标识位

//定義判斷發送起始字節的宏
#define JUDGE_START_BYTE(x)             \
        (((x)== CNT_SEND_DATA_START_BYTE)||((x)== CNT_SEND_DEBUG_START_BYTE))  

//定義判斷發送合法ASCLL內容的宏
#define JUDGE_SEND_BYTE(x)              \
    	(                               \
    	    JUDGE_START_BYTE(x) \
    	    ||(((x)>='0')&&((x)<='9'))  \
    	    ||(((x)>='A')&&((x)<='F'))  \
    	    ||(((x)>='a')&&((x)<='f'))  \
    	    ||((x)=='\r')  \
    	    ||((x)==CNT_SEND_END_BYTE)  \
    	)

static  INT8U SendBuf[CNT_SEND_MAX_NUM];         //数据接收缓存区
static  INT8U *SendPtr;         //数据發送缓存区指針
static  INT8U SendByteCnt             =0xFF;     //發送字节计数,初始化為無效.只有發送到起始字節清0後有效

/*
*********************************************************************************************************
*                                  START TRANSMISSION OF REPLY PACKET
*********************************************************************************************************
*/

void  Mass_TxStart (INT8U *send_start)
{

#if OS_CRITICAL_METHOD == 3
    OS_CPU_SR    cpu_sr = 0;                                    /* Storage for CPU status register     */
#endif
	INT8U i,a_char;
    //a=0;
    //b=1;

        

    OS_ENTER_CRITICAL();
    //只有在發送封包空閑并且為有效起始字節時才開始發送
    if ((SendByteCnt == 0xFF)&& JUDGE_START_BYTE(*send_start))
    {    
    	//將發送內容復制到發送緩沖區并啟動發送。
    	//使用發送緩沖區是為了防止發送內容的存儲空間在發送過程中被修改。
    	for(i=0;i<CNT_SEND_MAX_NUM-5;i++)
    	{
    		a_char=*(send_start+i);
    	    if JUDGE_SEND_BYTE(a_char)
    	    {
    	    	SendBuf[i]=a_char;
                if(a_char=='\r')
                {
    	    	    SendBuf[i+1]=CNT_SEND_END_BYTE;
                }
                if((a_char=='\r')||(a_char==CNT_SEND_END_BYTE))
                {
                    U1TXREG=*SendBuf;
                    SendByteCnt = 0x01;//啟動發送
                    SendPtr=SendBuf;
                	break;
                }
    	    }
    	    else
    	    {
                break;
            }
    	}
    }
    OS_EXIT_CRITICAL();
}

/*
*********************************************************************************************************
*                                               Tx Handler
*
* Description: This routine is called from the transmitter buffer empty interrupt service handler.
*              It will send out the next byte in the buffer.
*
*********************************************************************************************************
*/

void SendServer(void)
{
    //如果MCU不能硬件清除字节發送中断标识位,则需要进行软件清除
#ifdef SOFT_CLEAR_TI
    BIT_SEND_INT_FLAG=0;
#endif

    SendPtr++;
    //發送有效數據(HEX ASCLL編碼,或結束符)
    if(
    	(SendByteCnt<CNT_SEND_MAX_NUM)
    	&&  JUDGE_SEND_BYTE(*SendPtr)
      )
    {
        U1TXREG=*SendPtr;
        SendByteCnt++;
        //当發送到終止字節,或指令數據過長时,設置發送字節指針無效以停止發送
        if(*SendPtr==CNT_SEND_END_BYTE)
        {
            SendByteCnt=0xFF;//
            OSMboxPost(MboxTx_Finish,(void*)1);//通知其它任務數據已成功發送完畢
        }
    }
    else
    {
        SendByteCnt=0xFF;//
        OSMboxPost(MboxTx_Finish,(void*)2);//通知其它任務數據發送無效
    }
}

⌨️ 快捷键说明

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