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

📄 uart.c.svn-base

📁 单片机驱动32X64点阵资料
💻 SVN-BASE
字号:
/********************************************************************************************************
 ** 功能描述: 串口中断,
 ** 日  期:
********************************************************************************************************/
#include"stc89c51rc.h"
#include " uart.h"	  
#include <intrins.h>

int  rCOMM_TOTAL1 ;       	//有效接收数据个数

uchar ucUart_buffer[BUFFER_NUM][16];
xdata  uchar ucUart_buffer_data[16]; 
uchar   ucDatabuf[3]; //接收缓冲
idata uchar ucUart_rd = 0;
uchar ucUart_wr = 0;
uchar ucUart_buffer_pv = 0;
uchar   ucState=0;              //接收状态  
uchar   ucReceDataNum=0;         //有效接收个数
uchar  ucReceVeryfy;	 //校验累加和变量
uchar   ucSendVeryfy;
uchar   ucReceData[16]; //read data
uchar   ucSendData[16]; //send data

uchar   ucSendDataNum=0;         //已发送字节数

//uchar   STATE=0;               //接收状态 
bit     uart_sBIT;  			 //发送完成标志
bit     uart_rBIT;			 //接收标志
 
//-------------------------------------------------------
//-------------------串口,跟6410通信--------------------

void MAIN_RS_INT(void) interrupt 4
{
    uchar DataTemp;
    if(RI)  // 接收
    {
        RI = 0;
		if( ucUart_buffer_pv >= BUFFER_NUM ) return;
        DataTemp = SBUF;
		switch(ucState)
        {   
		                           
            case ucState_START:  //开始位 0
            {	 
                if(START == DataTemp)
                {
                     
					ucReceDataNum = 0;
					ucReceVeryfy = 0;
                    ucState = ucState_DATA1;
                    
                 }
                 break;
             }

            case ucState_DATA1:  //数据长度位
            {
               ucDatabuf[ucReceDataNum++] = DataTemp; 
				 
                if(ucReceDataNum == 3)             
                {
                    if(ucDatabuf[2] == ucReceVeryfy)
					{
						
						ucState = ucState_DATA2; 
						ucReceVeryfy = 0;
						ucReceDataNum = 0;
						rCOMM_TOTAL1 = ucDatabuf[ 0 ];
	                    rCOMM_TOTAL1 = (rCOMM_TOTAL1<<8) + ucDatabuf[1] ;
                        
					}
					else
					{	
					    ucState = ucState_START;
	                    ucReceDataNum = 0;
	                    ucReceVeryfy =0;
                    }
                }
				else 
                {
                    ucReceVeryfy += DataTemp;          
                }
                break;
                
            }
		    case ucState_DATA2:  //数据位 2
            {
     				
                    ucUart_buffer_data[ucReceDataNum++] = DataTemp;
				
                    if( ucReceDataNum  ==  rCOMM_TOTAL1+1 )             
                    {    	
                        if( ucUart_buffer_data[ ucDatabuf[2] ] ==  ucReceVeryfy )	 //判断校检和 	   
        				{    
                            ucState = ucState_END;
							  
                        }
                        else
						{
							ucState = ucState_START;
							ucReceDataNum = 0;
							ucReceVeryfy =0;
						}  
                    } 
                    else  if( ucReceDataNum > rCOMM_TOTAL1+1 )             
                    {
                         ucState = ucState_END; 
                    }
                    else 
                    {
                         ucReceVeryfy += DataTemp;  //计算校检和 
                    }
               
               
                break;
            } 
			case ucState_END:    //结束位 3
            {	
                if(END == DataTemp)
				{
                    uchar i;
            		 	  
                        for( i=0; i< rCOMM_TOTAL1; i++ )  
                        {  
						     ucUart_buffer[ucUart_wr][i] = ucUart_buffer_data[i];    
                        }
    					ucUart_wr ++;
						if( ucUart_wr >= BUFFER_NUM ) ucUart_wr = 0;
						ucUart_buffer_pv ++;	
                
				}
                ucState = ucState_START;
                break;
            }

            default:    
            {
                ucState  = ucState_START;
                break;
            }
        }

    }
    if(TI)
    {
        TI = 0; 
        ucSendDataNum++;
		 if(ucSendDataNum < ucSendData[3]+6)
	    {
	        SBUF = ucSendData[ucSendDataNum];
	    }

        else
        {
            uart_sBIT = 1;
        }
    }
}
/*********************************************************************************************************
 ** 功能描述: 
 ** 日   期: 
*********************************************************************************************************/

bit send_dis_data(uchar Data1,uchar Data2,uchar *SendDeatBuf3)     //转发可变协议
{
    uchar i;
	uint Data3;
	
	ucSendData[0]=START;
	ucSendData[1]=Data1;
	ucSendData[2]=Data2;
	ucSendData[3]= ucSendData[1] + ucSendData[2]; 
	 
	Data3 = Data1;
	Data3 = (Data3<<8) + Data2;
	
	ucSendVeryfy = 0;
	for( i=0;i< Data3 ;i++)  
	{  
	    ucSendVeryfy += *(SendDeatBuf3);
	    ucSendData[4 + i] = *(SendDeatBuf3++);
	}        
	ucSendData[ 4 + Data3 ]= ucSendVeryfy ;
	ucSendData[ 5 + Data3 ]= END;
	uart_sBIT = 0;
	ucSendDataNum = 0;
	EX1 = 0;
	SBUF = ucSendData[0];
	while(!uart_sBIT);
    EX1 = 1;
	return 0;

}

⌨️ 快捷键说明

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