原创 纠结的串口

2011-9-24 02:12 1974 5 5 分类: MCU/ 嵌入式

串口调试结果

1:我用的串口调试助手不能显示汉字,超级终端可以;

2ASCII码来显示,比如将0x61发送给串口,串口助手和超级终端都显示a;

3:不用包含stdio.h头文件同样可以在超级终端和串口助手做到回车换行的效果,方法是发送0d,0a两个字节就可以

4:串口发送字符时也是按照ASCII码发送,比如说发送aSBUF将接收到0x61,发送1SBUF将接收到49等。所以判断时先将ASCII码转换成十进制才正确

5:将a25a这四个字符一个一个的发,和一次全部发,效果一样。

6:调试时要根据自己的晶振在串口调试助手那选择对应的波特率。

7:以下是经过过修改的网络程序,已经注明转帖

#include<reg51.h>

#include <string.h>

 

static unsigned char data CN[4];

static unsigned char data CT;

unsigned char TS[8]={254,252,248,240,224,192,128,0};

 

sbit P2_6=P2^6;

 

void delay(unsigned int time)

{

 while(time--);

}

 

void S_init(unsigned char baudrate)

{

   unsigned char THTL;

   switch(baudrate)

   {

      case 1: THTL = 64;  break; //波特率300

      case 2: THTL = 160; break; //600

      case 3: THTL = 208; break; //1200

        case 4: THTL = 232; break; //2400

      case 5: THTL = 244; break; //4800

      case 6: THTL = 250; break; //9600

      case 7: THTL = 253; break; //19200

      case 8: THTL = 255; break; //57600

      default: THTL = 208;

   }

   SCON=0x50; //方式1,允许接收

   TMOD=0x20;

   PCON|=0x80;

   TH1=THTL;

   TL1=THTL;

   TI=0;

   RI=0;

   TR1=1;

   ES=1;

   EA=1;

}

 

 //向串口输出一个字符

 

void S_PutNum(unsigned char dat)

{

   ES=0;

   TI=0;

   SBUF=dat;

   while(!TI);

   TI=0;

   ES=1;

}

/**************************************************************************

 - 功能描述:51单片机的串口发送0d 0a ,即回车换行

 - 隶属模块:STC51串口操作

 - 函数属性:外部,使用户使用

 - 参数说明:无

 - 返回说明:无

 - 注:此函数就是发送0d 0a这两个字节,在“超级终端”上会有回车换行的效果

 **************************************************************************/

 

void UART_Send_Enter()

{

 S_PutNum(0x0d);

 S_PutNum(0x0a);

}

 

/**************************************************************************

 - 功能描述:51单片机的串口发送字符串

 - 隶属模块:STC51串口操作

 - 函数属性:外部,使用户使用

 - 参数说明:s:指向字符串的指针

 - 返回说明:无

 - 注:如果在字符串中有'\n',则会发送一个回车换行

 **************************************************************************/

 

void UART_Send_Str(char *s)

{

 int len=strlen(s)-1;

 int i;

 for(i=0;i<len;i++)

   S_PutNum(s);

 if(s=='\n')

 {

  UART_Send_Enter();

 }

 else

 {

  S_PutNum(s);

 }

}

 

void CNToOut(void)

{

  S_PutNum(CN[0]);

  S_PutNum(CN[1]);

  S_PutNum(CN[2]);

  S_PutNum(CN[3]);

}

void CS2OUT()

{

  unsigned char a;

  unsigned char b;

  switch(CN[1])           //aXXa的格式定义是第一个X为端口,0P0,1P12P2,3为关闭所有(同时第二个X也是3

  {                                 //XX4为测试用,5 为读取端口状态,大于5 则为无效数据

    case 48:                    //第一个X 小于3 时,第二个X 为要输出的数据

         P0=CN[2];

         CNToOut();

         break;

     case 49:

         P1=CN[2];

       CNToOut();

         break;

     case 50:

         P2=CN[2];

       CNToOut();

         break;

     case 51:

        P0 = 0xFF;

        P1 = 0xFF;

        P2 = 0xFF;

        CNToOut();

       break;

     case 52:

         P0=0xff;

       P1=0xff;

       P2=0xff;

       for(a=0;a<8;a++)

       {

          P0 = TS[a];

           for (b=0; b<50000; b++);

       }

       P0=0xff;

       for (a=0; a<8; a++)

        {

          P1 = TS[a];

          for (b=0; b<50000; b++);

        }

        P1 = 0xFF;

        for (a=0; a<4; a++)

        {

         P2 = TS[a];

         for (b=0; b<50000; b++);

        }

        P2 = 0xFF;

        CNToOut();

        break;

     case 53:               //根据CN[2]返回所要读取的端口值

          switch(CN[2])

         {

            case 48:

               S_PutNum(CN[0]);

               S_PutNum(CN[1]);

               S_PutNum(P0);

               S_PutNum(CN[3]);

               break;

            case 49:

               S_PutNum(CN[0]);

               S_PutNum(CN[1]);

               S_PutNum(P1);

               S_PutNum(CN[3]);

               break;

            case 50:

               S_PutNum(CN[0]);

               S_PutNum(CN[1]);

               S_PutNum(P2);

               S_PutNum(CN[3]);

               break;

            case 51:

               S_PutNum(CN[0]);

               S_PutNum(CN[1]);

               S_PutNum(P3);

               S_PutNum(CN[3]);

               break;

        

          }

         break;

     }

 

}

 

void S_INT() interrupt 4

{

  if(RI)

  {

     if (CT>3)

     {

        CT = 0; //收完一组数据,序列指针清零

        CN[0] = 0;

        CN[1] = 51;

        CN[2] = 51;

        CN[3] = 0;

     }

      CN[CT]=SBUF;

      P1=SBUF;

      <?xml:namespace prefix = st1 />CT++;

      RI=0;

      if((CN[0]==0x61)&&(CN[3]==0x61)) //aXXa的简单方式保障接收的可靠性

      {

         CS2OUT();

      }

  }

}

 

void main()

{

   unsigned int a;

   CT = 0; //接收字符序列

   CN[0] = 0;

   CN[1] = 51;

   CN[2] = 51;

   CN[3] = 0;

   S_init(6);

   UART_Send_Str("串口设置完毕\r\n");

   for(a=0;a<10;a++)

   {

     S_PutNum(0x61);

   }

   do

    {

        delay(50000);

        delay(50000);

        delay(50000);

       P2_6 = 1;

        delay(50000);

        delay(50000);

       delay(50000); //指示灯闪动

       P2_6 = 0;

    }while(1);

}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /1 下一条