搜索
bottom↓
回复: 3

分享之二:USART.lib ,串口函数库 for CVAVR

[复制链接]

出0入4汤圆

发表于 2006-7-12 08:31:51 | 显示全部楼层 |阅读模式
USART.lib ,串口函数库 for CVAVR

点击此处下载armok01123008.rar



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

/*    USART Library

/*   

/*    Designed by Aleyn.wu

/*    E-mail: Aleyn@e-midas.cn

/*    Last Update:2005.10.16

/*

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

#include <io.h>

#include <USART.h>



//#if funcused TransmitByte

void TransmitByte(unsigned char C)

{

        while (!(UCSRA&(1<<UDRE)));

        UDR=C;

}

//#endif



//#if funcused ReceiveByte

unsigned char ReceiveByte(void)

{

        while (!(UCSRA&(1<<RXC)));

        return UDR;

}

//#endif



#if funcused TransmitLine

void TransmitLine(char *s)

{

          while (*s)

        {

                 TransmitByte(*s);

                s++;

        }

        TransmitByte(0x0d);

        TransmitByte(0x0a);

}

#endif



#if funcused TransmitLineF

void TransmitLineF(flash char *s)

{

          while (*s)

        {

                 TransmitByte(*s);

                s++;

        }

        TransmitByte(0x0d);

        TransmitByte(0x0a);

}

#endif



#if funcused TransmitString

void TransmitString(char *s)

{

           while (*s)

         {

         TransmitByte(*s);

         s++;

         }

}

#endif



#if funcused TransmitStringF

void TransmitStringF(flash char *s)

{

           while (*s)

         {

         TransmitByte(*s);

         s++;

         }

}

#endif





#if funcused USART_Init

void USART_Init(unsigned char BaudRate)

{

    UCSRB = 0x00; //disable while setting baud rate

    UCSRA = 0x00;

    UCSRC = 0x00;

    UCSRB=(1<<RXEN)|(1<<TXEN);

        #ifndef _MEGA128_INCLUDED_

    UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

        #else

        UCSRC=(1<<UCSZ1)|(1<<UCSZ0);

        #endif

    UBRRL=BaudRate;

    UBRRH=0;

    //UBRR=BaudRate;

}

#endif



#if funcused TestRate

void TestRate(void)

{

           unsigned char i;

         int j;

         i=0;

         while (i<255)

         {

         USART_Init(i);

         TransmitString("RATE");

         TransmitByte(i);

         

         i++;

         for (j=1;j<65535;j++);

     }

}

#endif



#if funcused ReceiveCMD

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

//   ReceiveCMD 函数

//   从USART中读取一条命令字符串

//   参数:

//       CmdBuf: 命令串缓冲区

//       MaxCmdBuf:缓冲区最大长度

//   返回:

//       CmdBuf,如果命令读取成功,则CmdBuf[0]不为0,否则为0.

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

void ReceiveCMD(unsigned char * CmdBuf)

{

  unsigned char Cmd;     //读取一个字节

  unsigned char BufIdx;  //命令缓冲区Index

  unsigned int  wait;    //设置超时

  if (UCSRA&(1<<RXC)) //串口有信息吗?

   {

     Cmd=UDR;    //如果有,接收一个字节

     BufIdx=1;

     if (Cmd==CMD_BEGIN)

      {

        wait=0;  //wait是做为命令串接收超时用的

         while ((Cmd!=CMD_END)&&(BufIdx<15))  //如果 CMD不是命令结束符

         {

         if (UCSRA&(1<<RXC))   //如果串口有信息,就继续接收

           {

            Cmd=UDR;

                  if ((Cmd!=CMD_BEGIN)&&(Cmd!=CMD_END)&&(BufIdx<CMD_MAXBUFFER-1))   //如果不是命令开始符或命令结束符则

                      {

                       CmdBuf[BufIdx++]=Cmd;  //保存命令到缓冲区

                       CmdBuf[0]=BufIdx-1;    //写命令长度

                      }

                  wait=0;

                  }

                  else

                  {

                   wait++;

                  }

                  if (wait>=65530)   //如果接收命令超时

                  {

                   CmdBuf[0]=0;      //取消命令

                   BufIdx=1;

                   break;

                  }

                 }

         if (BufIdx>=CMD_MAXBUFFER)   //如果命令行太长

            {

              CmdBuf[0]=CMD_MAXBUFFER-1;  //截止长度

              BufIdx=1;

            }  

         else

            {

             CmdBuf[0]=BufIdx-1;     //设置长度

             CmdBuf[BufIdx]=0;

            }

      }

   }

}

#endif



#if funcused ReceiveString

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

//   ReceiveString 函数

//   从USART中读取一条命令字符串

//   参数:

//       CmdBuf: 命令串缓冲区

//       MaxCmdBuf:缓冲区最大长度

//   返回:

//       CmdBuf,如果命令读取成功,则CmdBuf[0]不为0,否则为0.

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

void ReceiveString(unsigned char * CmdBuf)

{

  unsigned char Cmd;     //读取一个字节

  unsigned char BufIdx;  //命令缓冲区Index

  unsigned int  wait;    //设置超时

  if (UCSRA&(1<<RXC)) //串口有信息吗?

   {

     Cmd=UDR;    //如果有,接收一个字节

     BufIdx=1;

     if (Cmd!=0)

      {

        wait=0;  //wait是做为命令串接收超时用的

            CmdBuf[BufIdx]=Cmd;  //保存命令到缓冲区

        CmdBuf[0]=BufIdx++;    //写命令长度

        

         while ((Cmd!=0)&&(BufIdx<CMD_MAXBUFFER))  //如果 CMD不是命令结束符

         {

         if (UCSRA&(1<<RXC))   //如果串口有信息,就继续接收

           {

            Cmd=UDR;

                  if ((Cmd!=0)&&(BufIdx<CMD_MAXBUFFER-1))   //如果不是命令开始符或命令结束符则

                      {

                       CmdBuf[BufIdx]=Cmd;  //保存命令到缓冲区

                       CmdBuf[0]=BufIdx++;    //写命令长度

                      }

                  wait=0;

                  }

                  else

                  {

                   wait++;

                  }

                  if (wait>=65530)   //如果接收命令超时

                  {

                   //CmdBuf[0]=0;      //取消命令

                   //BufIdx=1;

                   break;

                  }

                 }

         if (BufIdx>=CMD_MAXBUFFER)   //如果命令行太长

            {

              CmdBuf[0]=CMD_MAXBUFFER-1;  //截止长度

              BufIdx=1;

            }  

         else

            {

             CmdBuf[0]=BufIdx-1;     //设置长度

             CmdBuf[BufIdx]=0;

            }

      }

      else

       {CmdBuf[0]=0;}

   }

   else

     {CmdBuf[0]=0;}

}

#endif



USART.lib ,串口函数库 for CVAVR

点击此处下载armok01123008.rar




-----此内容被aleyn于2006-07-12,08:32:51编辑过

出0入0汤圆

发表于 2006-7-12 09:13:01 | 显示全部楼层
请问这个函数库能否在XP下使用,能否对25针的并口操作呢?



我最近想自己做一个XP下使用的25针的并口下载线,请问有什么好的库可使用,请楼主多多指点。

出0入0汤圆

发表于 2006-12-15 22:46:12 | 显示全部楼层
非常不错..



2楼的问题好象有点……牛头不对马嘴吔。。

出0入0汤圆

发表于 2006-12-16 14:25:38 | 显示全部楼层
楼上所说的2楼就是你自已啊.



^_^ 那有人说自已牛头不对马嘴的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-10 19:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表