串口控制台

1.串口通讯概念

串口通讯,分为同步通讯和异步通讯,通常使用的都是异步串口。通讯时,双方先约定好数据帧的格式,即波特率,数据位,停止位,奇偶校验位等。

波特率:表示没秒钟传输的bit个数。如:300波特表示每秒钟发送300个bit。
起始位:当线路空闲时候,电平为高。一旦检测到一个下降沿,则视为一个起始位。然后接收方按照约定好的格式,接收这一帧数据。
数据位:一帧中实际有效数据的位数。
停止位:表示这帧数据的结束。
校验位:用于检测数据传输是否正确的位

硬件引脚:(RS232,9帧串口)

2 :RXD:接收数据;3 :TXD:发送数据;5 :GND:接地

2.串口初始化

2.1 引脚说明

2.2 初始化步骤

2.2.1 配置引脚功能

2.2.2 设置数据格式

2.2.3 设置工作模式

2.3.4 FIFO ENABLE

2.2.5 设置波特率

 

 

3.串口收发

 

 

 4.代码

nand.c

 1 #define ULCON0     (*((volatile unsigned long *)0x7F005000))
 2 #define UCON0      (*((volatile unsigned long *)0x7F005004))
 3 #define UFCON0     (*((volatile unsigned long *)0x7F005008))
 4 #define UMCON0     (*((volatile unsigned long *)0x7F00500C))
 5 #define UTRSTAT0   (*((volatile unsigned long *)0x7F005010))
 6 #define UFSTAT0    (*((volatile unsigned long *)0x7F005018))
 7 #define UTXH0      (*((volatile unsigned char *)0x7F005020))
 8 #define URXH0      (*((volatile unsigned char *)0x7F005024))
 9 #define UBRDIV0    (*((volatile unsigned short *)0x7F005028))
10 #define UDIVSLOT0  (*((volatile unsigned short *)0x7F00502C))
11 
12 #define GPACON     (*((volatile unsigned long *)0x7F008000))
13 
14 #define PCLK 66500000
15 #define BOUD 115200
16 
17 void uart_init(void)
18 {
19     GPACON &= ~0xff;
20     GPACON |= 0x22;
21     
22     /* ULCON0 */
23     ULCON0 = 0x3;  /* 数据位:8, 无较验, 停止位: 1, 8n1 */
24     UCON0  = 0x5;  /* 使能UART发送、接收 */
25     UFCON0 = 0x01; /* FIFO ENABLE */
26 
27     UMCON0 = 0;
28     
29     /* 波特率 */
30     /* DIV_VAL = (PCLK / (bps x 16 ) ) - 1 
31      * bps = 115200
32      * DIV_VAL = (66000000 / (115200 x 16 ) ) - 1 
33      *         = 35.08
34      */
35     UBRDIV0 = (int)(PCLK/(BOUD*16)-1);
36 
37     /* x/16 = 0.08
38      * x = 1
39      */
40     UDIVSLOT0 = 0x1;
41     
42 }
43 
44 void putc(unsigned char c)
45 {
46     while (UFSTAT0 & (1<<14)); /* 如果TX FIFO满,等待 */
47     UTXH0 = c;                         /* 写数据 */
48 }
49 
50 
51 unsigned char getc(void)
52 {
53     unsigned char ret;
54     while ((UFSTAT0 & 0x7f) == 0);  /* 如果RX FIFO空,等待 */
55     ret = URXH0;                   /* 取数据 */
56     if((ret == 0x0d) || (ret == 0x0a))
57     {
58         putc(0x0d);
59         putc(0x0a);
60     }
61     else
62     {
63         putc(ret);
64     }
65 
66     return ret;
67 }
68 
69 
70 void uart_send_string(char *str)
71 {
72     while(*str)
73     {
74         putc(*str++);    
75     }
76     putc(0x0d);
77     putc(0x0a);    
78 }
View Code

printf函数的实现(可变参数列表)

printf.c

 1 #include "vsprintf.h"
 2 
 3 unsigned char outbuf[1024];
 4 unsigned char inbuf[1024];
 5 
 6 
 7 int printf(const char* fmt, ...)
 8 {
 9     va_list args;
10     int i;
11     
12 
13     
14         //1.将变参转化为字符串
15     va_start(args,fmt);  //利用fmt得到变参的个数,然后把变参放到args里面
16     
17     vsprintf((char *)outbuf, fmt, args);   //将变参转换为字符串
18     
19     va_end();  //结束转换
20 
21   
22     //2. 打印字符串到串口
23     for(i=0;i< strlen((char *)outbuf); i++)
24     {
25         putc(outbuf[i]);    
26     }
27     
28     return i;
29  
30 }
31 
32 
33 int scanf(const char* fmt, ...)
34 {
35     unsigned char c;
36     int i = 0;
37     va_list args;
38     
39     //1. 获取输入的字符串
40     
41     while (1)
42     {
43         
44         c = getc();    
45         if ((c==0x0d) || (c==0x0a))
46         {
47             inbuf[i] = '
';
48             break;
49         }
50         else
51         {
52             inbuf[i++] = c;    
53         }
54     }
55     
56     //2. 格式转化
57     va_start(args, fmt);
58     vsscanf((char *)inbuf,fmt,args);
59     va_end(args);
60     
61     return i;
62 }
View Code

 

原文地址:https://www.cnblogs.com/boyiliushui/p/6014257.html