51串口通信

51串口通信
//网上看了下资料,借鉴了别人的一些好的东西,同时自己封装了下
#ifndef __mycom__h__
#define  __mycon__h__
#include 
< string .h >
// 数据格式
// W 8  
#define  SUCCESS 1
#define  ERROR   0

#define  uchar unsigned char
#define  uint  unsinged int

#define  BUF_LEN 30   // 传冲区大小
#define  RECIEVED_MAX_DATA_LEN 16
#define  SEND_MAX_DATA_LEN 25
#define  END_NUM 4    // 结束符长度


typedef 
void  ( * PTRFUN)(uchar * ,uchar);
PTRFUN ptrFun;
 
uchar END_CODE[
4 ] = " #end " ;
uchar end_num
= 0 ;
uchar data_num
= 0 ;        // 接受数据个数
uchar data_buf[BUF_LEN]; // 缓冲区大小
uchar data_addr = 0 ;       // 数据在data_buf位置
bit isComplete = 0 ;      // 处理

typedef  
struct
{
char  name[ 10 ];    // 姓名
int  age;          // 年龄
char  sex[ 5 ];      // 性别
}st;

st b;

// 初始化
void  init_serialcomm( void )
{
    SCON 
=   0x50 ;        // SCON: serail mode 1, 8-bit UART, enable ucvr
    TMOD  |=   0x20 ;        // TMOD: timer 1, mode 2, 8-bit reload
    PCON  |=   0x80 ;        // SMOD=1;
    TH1    =   0xF4 ;        // Baud:4800 fosc=11.0592MHz
    IE    |=   0x90 ;        // Enable Serial Interrupt
    TR1    =   1 ;           //  timer 1 run
   
//  TI=1;
}

// *******数据转换*********************
uchar decoderData(){
    uchar state,i;
    state
= 0 ;
    i
= 2 ;
    
// -----------------------计算地址-------------------------------
     while ( 1 ){
        
if ( (data_buf[i] > 47 ) && (data_buf[i] < 58 ) )              //  是‘0’-‘9’?
            state  =  (state * 10 ) + (data_buf[i] - 48 );         //  计算
         else   if ( data_buf[i] == '   '  )     break ;             //  是空格,跳出
         else                                                       //  非'0'-'9'和' '
        {
            
return  ERROR;                                     //  返回错误
        }
        
if ( i > 4  )                                             //  输入数字过大
        {
            
return  ERROR;
        }
        i
++ ;
    }
    data_buf[
1 ] = state; // 数据个数
    data_addr =++ i;
    
return  SUCCESS;
}
// ***************************接收处理**************************************
void  afterRecived( void )
{
    
if ( decoderData() == ERROR )     return ;             //  错误,返回
     if ( data_buf[ 1 ] > RECIEVED_MAX_DATA_LEN )                                     //  写入个数判断
    {
        
return ;                                             //  数据个数太多,返回
    }
    ptrFun(
& data_buf[data_addr],data_buf[ 1 ]);
}

// 向串口发送一个字符
void  send_char_com(unsigned  char  ch)  
{
    SBUF
= ch;
    
while (TI == 0 );
    TI
= 0 ;
}

// 向串口发送一个字符串,strlen为该字符串长度
void  send_string_com(unsigned  char   * str,uchar len)
{
    unsigned 
int  k = 0 ;
    
do
    {
        send_char_com(
* (str  +  k));
        k
++ ;
    } 
while (k  <  len);
}
void  sendBefore( void *  p){
    
char *  m = ( char * )p;
    uchar len
= sizeof (st);
    send_string_com(m,len);
}
// 串口接收中断函数
void  serial () interrupt  4   using   3
{
    unsigned 
char  state;
    
if ( RI == 1  )
    {
        state 
=  SBUF;                 //  缓存接收到的数据
        RI  =   0 ;                         //  接收标志清零
// ---------------------检测结束命令#end---------------------------
         if ( state == END_CODE[end_num] )    
        {
            end_num
++ ;
            
if ( end_num == END_NUM )
            {
                end_num 
=   0 ;
                isComplete 
=   1 ;
                ES
= 0 ;
            }
        }
        
else  end_num  =   0 ;
// ---------------------串口数据处理-------------------------------
         if ( data_num > SEND_MAX_DATA_LEN )        
        {
            data_num 
=   0 ;
            
// ERROR 接受数据过长
        }
        data_buf[data_num
++ =  state;
    }
}


#endif

#include  < REGX52.H >
#include 
" 51com.h "
#include 
" util.h "

unsigned 
char  key_map[] = { 0 , 7 , 8 , 9 , ' / ' , 4 , 5 , 6 , ' * ' , 1 , 2 , 3 , ' - ' , ' c ' , 0 , ' = ' , ' + ' };
unsigned 
char  tab[] = { 0xFE , 0x30 , 0x6d , 0x79 , 0x33 , 0x5b , 0x5f , 0x70 , 0x7f , 0x7b };

void  process(uchar *  p,len){
    P1
= tab[string_to_int(p,len)];
}

void  main( void )
{   
    init_serialcomm(); 
// 初始化串口
    ptrFun = process;


    b.age = 10 ;
 

    sendBefore( & b);

   
// send_string_com("b",1);
     while ( 1 )
    {
        
if ( isComplete == 1  )                  //  串口接收到一串数据
        {    
            isComplete 
=   0 ;                     //  标志清零
             if ( data_buf[ 0 ] == ' R '  )afterRecived();
            
else   if ( data_buf[ 0 ] == ' S '  )send_string_com( " b " , 1 );
            data_num 
=   0 ;               //  重新开始接收数据
            ES  =   1 ;                             //  允许串口中断
        }
    }
}


你可能感兴趣的:(51串口通信)