Mini2440串口.doc_第1页
Mini2440串口.doc_第2页
Mini2440串口.doc_第3页
Mini2440串口.doc_第4页
Mini2440串口.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Mini2440串口CMini2440有三个串口,USRT0,UART1,UART3。对串口的操作有三种:串口初始化,串口接收,串口发送1 串口初始化1)串口初始化函数void Uart_Init(int pclk,int baud)int i;if(pclk = 0)pclk= PCLK;rUFCON0 = 0x0; /UART channel 0 FIFO control register, FIFO disablerUFCON1 = 0x0; /UART channel 1 FIFO control register, FIFO disablerUFCON2 = 0x0; /UART channel 2 FIFO control register, FIFO disablerUMCON0 = 0x0; /UART chaneel 0 MODEM control register, AFC disablerUMCON1 = 0x0; /UART chaneel 1 MODEM control register, AFC disable/UART0rULCON0 = 0x3; /Line control register : Normal,No parity,1 stop,8 bits /10 9 8765 4 3:21:0 / Clock Sel,Tx Int,Rx Int, Rx Time Out, Rx err, Loop-back, Send break,Transmit Mode, Receive Mode / 01 0, 010 0 , 0101 / PCLK LevelPulseDisableGenerateNormalNormalInterrupt or PollingrUCON0= 0x245; / Control registerrUBRDIV0=( (int)(pclk/16./baud+0.5) -1 ); /Baud rate divisior register 0/UART1rULCON1 = 0x3;rUCON1= 0x245;rUBRDIV1=( (int)(pclk/16./baud+0.5) -1 );/UART2rULCON2 = 0x3;rUCON2= 0x245;rUBRDIV2=( (int)(pclk/16./baud+0.5) -1 );for(i=0;i100;i+);l 串口时钟的设置pclk= PCLK;使用PCLK作为串口的时钟。l 寄存器进行了设置主要是对三种寄存器进行了设置rUFCONn (n=0,1,2) 串口FIFO控制寄存器rUMCONn (n=0,1)串口调制控制寄存器rULCONn (n=0,1,2)串口线性控制寄存器rUCONn(n=0,1,2)串口控制寄存器rUBRDIVn(n=0,1,2)串口Tx,Rx收发速率的设定2)串口的选择void Uart_Select(int ch)whichUart = ch;2 串口发送串口发送数据通过判断rUTRSTATn (n=0,1,2)的第2位是不是为1来判断发送缓存是否为空。1)串口发送字节void Uart_SendByte(int data)if(whichUart=0)if(data=/n)while(!(rUTRSTAT0 & 0x2); / Delay(1); /because the slow response of hyper_terminalWrUTXH0(/r);while(!(rUTRSTAT0 & 0x2); /Wait until THR is empty./Delay(1);WrUTXH0(data);else if(whichUart=1)if(data=/n)while(!(rUTRSTAT1 & 0x2);/Delay(1); /because the slow response of hyper_terminalrUTXH1 = /r;while(!(rUTRSTAT1 & 0x2); /Wait until THR is empty./Delay(1);rUTXH1 = data;else if(whichUart=2)if(data=/n)while(!(rUTRSTAT2 & 0x2);/Delay(1); /because the slow response of hyper_terminalrUTXH2 = /r;while(!(rUTRSTAT2 & 0x2); /Wait until THR is empty./Delay(1);rUTXH2 = data;首先是串口通道的选择;然后判断THR是否为空,直到等到发送缓存为空,退出while循环;再要发送的字节data放到发送缓存中。如果发送的数据是回车的话,直接发送转义字符/r,当然也要等到THR为空才可以发送。2)串口发送字符串void Uart_SendString(char *pt)while(*pt)Uart_SendByte(*pt+);把字符串看作是字符数组,字符指针*pt来指代字符数组的首地址,读取指针指向的字符,这样就可以把发送的的字符串逐个进行字节发送了。2 串口接收串口接收通过判断rUTRSTATn (n=0,1,2)的第1位是不是为1来判断发送缓存是否为空。1)串口等待接收状态void Uart_TxEmpty(int ch)if(ch=0)while(!(rUTRSTAT0 & 0x4); /Wait until tx shifter is empty.else if(ch=1)while(!(rUTRSTAT1 & 0x4); /Wait until tx shifter is empty.else if(ch=2)while(!(rUTRSTAT2 & 0x4); /Wait until tx shifter is empty.寄存器rUTRSTATn & 0x4 (n=0,1,2)来判断tx shifter是不是为空3)接收字符char Uart_Getch(void)if(whichUart=0)while(!(rUTRSTAT0 & 0x1); /Receive data readyreturn RdURXH0();else if(whichUart=1)while(!(rUTRSTAT1 & 0x1); /Receive data readyreturn RdURXH1();else if(whichUart=2)while(!(rUTRSTAT2 & 0x1); /Receive data readyreturn RdURXH2();return 0 ;寄存器rUTRSTATn & 0x1(n=0,1,2)来判断Receive data ready?并把接收到的数据写到接收缓存里面。4)接收字符串void Uart_GetString(char *string)char *string2 = string;char c;while(c = Uart_Getch()!=/r)if(c=/b)if( (int)string2 (int)string )Uart_Printf(/b /b);string-;else*string+ = c;Uart_SendByte(c);*string=/0;Uart_SendByte(/n);char Uart_GetKey(void)if(whichUart=0)if(rUTRSTAT0 & 0x1)/Receive data readyreturn RdURXH0();elsereturn 0;else if(whichUart=1)if(rUTRSTAT1 & 0x1)/Receive data readyreturn RdURXH1();elsereturn 0;else if(whichUart=2)if(rUTRSTAT2 & 0x1)/Receive data readyreturn RdURXH2();elsereturn 0;return 0 ;寄存器rUTRSTATn & 0x1 (n=0,1,2)来判断Receive data ready?并把接收到的数据写到接收缓存里面。否则返回空。与getchar类似,并且也是返回字符类型。5)接收整形数字函数返回类型:整形int Uart_GetIntNum(void)char str30;char *string = str;int base = 10;int minus= 0;int result = 0;int lastIndex;int i;Uart_GetString(string);if(string0=-)minus = 1;string+;if(string0=0 & (string1=x | string1=X)base= 16;string += 2;lastIndex = strlen(string) - 1;if(lastIndex0)return -1;if(stringlastIndex=h | stringlastIndex=H )base = 16;stringlastIndex = 0;lastIndex-;if(base=10)result = atoi(string);result = minus ? (-1*result):result;elsefor(i=0;i=lastIndex;i+)if(isalpha(string)if(isupper(string)result = (result4) + string- A + 10;elseresult = (result4) + string- a + 10;elseresult = (result4) + string- 0;result = minus ? (-1*result):result;return result;首先以字符串的形式接收数据Uart_GetString(string);然后通过判断是不是以-开头来确定是不是负数,是负数则minus=1;再通过以0x,oX开头或者以H,h结尾来判断是不是16进制,否则为10进制;如果是10进制,则通过atoi把字符串转化为数字,并加上正负,如果是16进制,判断是不是字母,再判断大小写字母分别进行转换。16进制也支持正负号。6)接收10进制的数int Uart_GetIntNum_GJ(void)char string16 ;char *p_string = string ;char c;int i = 0 ;int data = 0 ;while( ( c = Uart_Getch() != /r) if(c=/b) p_string-; else *p_string+=c; Uart_SendByte( c ) ;*p_string = /0;i = 0 ;while( string!= /0 ) data = data * 10 ; if( string9 ) return -1 ; data = data + ( string-0 ) ; i+ ;return data ;只转化10进制的数字。首先用getchar接收单个字符存储在string中,然后把string转换为整型的data。并返回整形的data。3串口打印/If you dont use vsprintf(), the code size is reduced very much.void Uart_Printf(char *fmt,.)va_list ap;char string256;va_start(ap,fmt);vsprintf(string,fmt,ap);Uart_SendString(string);va_end(ap);va_list完成可变参数的操作具体实现如下n 由于无法列出传递函数的所有实参的类型和数目时,用省略号指定参数表void Uart_Printf(char *fmt,.)n 函数参数的传递原理函数参数是以数据结构:栈的形式存取,从右至左入栈.n 获取省略号指定的参数在函数体中声明一个va_list,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论