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 }
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 }