mini2440 UART实现串口接收后转换为整型数据

来源:互联网 发布:ipc软件下载 编辑:程序博客网 时间:2024/04/27 09:28

本实验通过UART接受数据,判断数据类型,转换为整型数据,打印出输入数据的整型值。本实验为以后裸机实验输入部分打下基础,具体实现以注释形式给出,实验代码如下:

#define    GLOBAL_CLK              1

#include <stdlib.h>

#include <string.h>

#include "def.h"

#include "option.h"

#include "2440addr.h"

#include "2440lib.h"

#include "2440slib.h"

#include "mmu.h"

#include "profile.h"

#include "memtest.h"

 

 

#include <stdarg.h>

#include <stdio.h>

#include <ctype.h>

void Uart0_init(void)

{

      

       rGPHCON = 0xa0; //设置GPH2GPH3TXD0(发送),RXD0(接收)

 

       rGPHUP  = 0xf0;//禁止GPH2GPH3上拉功能

 

      rULCON0 = 0x3; //设置UART0无奇偶校验,一位停止位,8位数据

 

       rUCON0 = 0x245; //PCLK为时钟源,接收和发送数据为中断方式

 

       rUFCON0 = 0; //不使用FIFO

 

       rUMCON0 = 0; //不使用流控制

 

       rUBRDIV0 = 26; //((UART_CLK/(波特率*16)-1)设置波特率,PCLK50MHz,波特率为115.2kHz

}

 

char Uart_getch()//接收字符

{

       char c;

       while(!(rUTRSTAT0 & 0x1)); //判断接收缓冲区是否非空

       return RdURXH0();//返回接收地址

}

 

void Uart_Getstring(char *string)//接收字符串

{

       char *string1=string;//string的首地址保存在string1

       char c;//定义一个字符变量

       while((c=Uart_getch()) != '\r')//如果接收到的字符不为回车就一直循环

       {

              if(c=='\b')//如果字符为退格

              {

                     if((int)string1 < (int)string)//如果string没有到达首地址

                     string--;//指针后退一个

              }

              else

              *string++=c;//将接收到的字符放入string指向地址并经行地址加一

       }

       *string='\0';//将最后一位赋值为‘\ 0为字符串结束符         

}

 

int Uart_GetintNum(void)//将接收到得字符串转换为整形

{

       int base=10;//定义字符类型变量默认是十进制

       int minus=0;//定义正负标志变量

       int lastindex=0;//定义字符串长度变量

       int result=0;

       int i; //定义变量i

       char str[50];//定义字符数组用来存放字符串

       char *string=str;//将指针指向字符数组首地址

 

       Uart_Getstring(string);//接收字符串,并将其放入string指向的地址

       lastindex=strlen(string)-1;//计算字符串的长度

       if(lastindex<0)//如果长度为负

       return -1;//反回-1

       if(string[0]=='-')//如果字符串第一位为负号

       {    

              minus=1;//符号标记位为1

              string++;//地址加一去掉负号

       }    

       if(string[0]=='0' && ((string[1]=='x') || (string[1]=='X')))//如果前两位是0x0X

       {

              base=16;//类型为16进制

              string+=2;//去掉前俩个位

       }

       if((string[lastindex]=='h') || (string[lastindex]=='H'))//如果最后一位为hH

       {

              base=16;//类型为16进制

              string[lastindex]=0;//去掉最后一位

              lastindex--;            //长度减一

       }

       if(base==10)//如果是10进制

       {

              result = atoi(string);//自动转换为10进制

              result=minus?(-1*result):result;//如果是负数则结果乘以-1

       }

       else

       {

              for(i=0;i<=lastindex;i++)//循环整个字符串

              {

                     if(isalpha(string[i]))//如果是字母

                     {

                            if(isupper(string[i]))//如果是大写

                            result=(result<<4)+string[i]-'A'+10;//转换为大写字母

                            else

                            result=(result<<4)+string[i]-'a'+10;//转换为小写字母

                     }

                     else

                            result=(result<<4)+string[i]-'0';//转换为16进制数

              }

              result=minus?(-1*result):result;//如果16进制数为负乘以-1

       }

       return result;

}

 

void Main(void)//主函数

{ 

       Uart0_init();//UART0初始化

       while(1)

       {

       Uart_Printf("%d\n",Uart_GetIntNum());

       }

}