飞思卡尔MC9S12XS128  SCI串口相关…

来源:互联网 发布:div模块滚动加载 js 编辑:程序博客网 时间:2024/05/30 23:03

//串口的初始化

//波特率为9600,8位数据格式,无校验,一个停止位,用查询方式发送
void SCI_Init(void)
 
{
   SCI0BDH = 0x00;
   SCI0BDL =0x41;  //波特率=BUSCLK/(16*BR[12:0])=38400 ,BUSCLK=40MHz 14400_0xae  38400_0x41  230400_0x0b
   SCI0CR2 = 0x2C;//发送,接收允许,接收采用中断方式
}

 

//将8位二进制数转换为相应的ASCII字符
unsigned char Digit_ASCII(unsigned char temp)
 
{
   if(temp>=0x0A)//如查temp有两位,如11,则转换为B
       temp = temp + 'A' - 0x0A;//'A'=65, 0x0A=10,
    else
       temp = temp +'0';    //temp为数字0~9, 只有1位
    returntemp;
}

//发送单个字符,下面这两个函数均可以
void SCI_SendChar(unsigned char ch)
 
{
   while(SCI0SR1_TC ==0);      //keep waiting when notempty 
 
  SCI0DRL = ch;
}

//或者
void SCI_SendChar(unsigned char ch)
 
{
   while(SCI0SR1_TDRE ==0);      //keep waiting when notempty 
 
  SCI0DRL = ch;
}

 

//通过SCI发送字符串
void SCI_SendStr(char *str)
 
{
   while(*str!=0)
 
      SCI_SendChar(*str++);
 
}
  
 
//把一个8位数以ASCII形式通过SCI0发送去
void SCI_SendHex8(unsigned char a)
 
{
   unsigned char b;
   b = (unsignedchar)(a/0x10);//取8位数的高4位,低估位为0,如0xf1/0x10 = 0xf0
   b = Digit_ASCII(b);
   SCI_SendChar(b);
   b = (unsignedchar)(a%0x10);//取8位数的低4位,高4位为0, 如0xf1%0x10 = 0x01;
   b = Digit_ASCII(b);
  SCI_SendChar(b); 
 
}

//把一个8位无符号数以十进制的形式发送出去  
 void SCI_SendDec8u(unsigned chara)
 
 {
    unsignedchar b;
    b =(unsigned char)(a/100);//取百位
    b = b +'0';
   SCI_SendChar(b);
    a =a0;
    b =(unsigned char)(a/10);//取十位
    b = b +'0';
   SCI_SendChar(b);
    b =(unsigned char)(a);//取个位
    b = b +'0';
   SCI_SendChar(b);
 }
//将一个16位数以ASCII形式发送出去
void SCI_SendHex16(unsigned int a)
 
{
   SCI_SendHex8((unsigned char)(a>>8));//即temp = a>>8;先传a的高8位
   SCI_SendHex8((unsigned char)a);//后传a的低8位,(一个16位的数赋值给一个8位的变量,只取低8位,高8位自动丢失)
}

//以十进制的形式发送一个16位有符号数
void SCI_SendDec16s(int a)
 
{
    unsignedchar b;
   if(a&0x8000)//a为负数
 
   {
     SCI_SendChar('-');
     a = ~a +1; //取绝对值
    }
    b =(unsigned char)(a/10000);//取万位
    b = b +'0';
   SCI_SendChar(b);
    a =a000;
    b =(unsigned char)(a/1000);//取千位
    b = b +'0';
   SCI_SendChar(b);
    a =a00;
    b =(unsigned char)(a/100);//取百位
    b = b +'0';
   SCI_SendChar(b);
    a =a0;
    b =(unsigned char)(a/10);//取十位
    b = b +'0';
   SCI_SendChar(b);
    b =(unsigned char)(a);//取个位
    b = b +'0';
   SCI_SendChar(b);
}

//以十进制的形式发送一个16位无符号数
void SCI_SendDec16u(unsigned int a)
 
{
    unsignedchar b;
    b =(unsigned char)(a/10000);//取万位
    b = b +'0';
   SCI_SendChar(b);
    a =a000;
    b =(unsigned char)(a/1000);//取千位
    b = b +'0';
   SCI_SendChar(b);
    a =a00;
    b =(unsigned char)(a/100);//取百位
    b = b +'0';
   SCI_SendChar(b);
    a =a0;
    b =(unsigned char)(a/10);//取十位
    b = b +'0';
   SCI_SendChar(b);
    b =(unsigned char)(a);//取个位
    b = b +'0';
   SCI_SendChar(b);
}

 

//接收字符中断服务程序

chardata;
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 20 SCI0_Interrupt(void)
 
{
   if(SCI0SR1_RDRF == 1)//如果是接收到了字符
    {
       SCI0DRL;//清除RDRF的标志位
        data=SCI0DRL;//读取接收到的字符到data中
    }
}

 


 

// 可打印字符串转换为字节数据

//如:"C8329BFD0E01"--> {0xC8, 0x32, 0x9B, 0xFD, 0x0E,0x01}

// pSrc:源字符串指针

// pDst:目标数据指针

//nSrcLength: 源字符串长度

// 返回:目标数据长度

intgsmString2Bytes(const char* pSrc,unsigned char* pDst, intnSrcLength)

{

   for(inti=0; i

   {

       //输出高4位

       if(*pSrc>='0'&& *pSrc<='9')

       {

           *pDst= (*pSrc - '0') << 4;

       }

       else

       {

           *pDst= (*pSrc - 'A' + 10) << 4;

       }

   

       pSrc++;

   

       //输出低4位

       if(*pSrc>='0'&& *pSrc<='9')

       {

           *pDst|= *pSrc - '0';

       }

       else

       {

           *pDst|= *pSrc - 'A' + 10;

       }

       pSrc++;

       pDst++;

   }

   

   //返回目标数据长度

   returnSrcLength / 2;

}

   

// 字节数据转换为可打印字符串

// 如:{0xC8, 0x32, 0x9B, 0xFD,0x0E, 0x01} --> "C8329BFD0E01"

// pSrc:源数据指针

// pDst:目标字符串指针

//nSrcLength: 源数据长度

// 返回:目标字符串长度

intgsmBytes2String(const unsigned char*pSrc, char* pDst, intnSrcLength)

{

   constchartab[]="0123456789ABCDEF";   // 0x0-0xf的字符查找表

   

   for(inti=0; i

   {

       //输出低4位

       *pDst++= tab[*pSrc >> 4];

   

       //输出高4位

       *pDst++= tab[*pSrc & 0x0f];

   

       pSrc++;

   }

   

   //输出字符串加个结束符

   *pDst= '\0';

   

   //返回目标字符串长度

   returnnSrcLength * 2;

}

来自:http://blog.csdn.net/dlutxie/article/details/6709482
0 0