• 串口控制台


    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

     

  • 相关阅读:
    笔记本Linux系统,修改合盖不待机
    用Java8把List转为Map
    获取本地请求的真实IP地址
    PowerDesigner 把Comment复制到name中和把name复制到Comment
    axios封装http请求
    Fiddler代理配置
    第十九章 代码重用
    第十八章 字符串
    第十七章 特殊类成员
    第十六章 多态性
  • 原文地址:https://www.cnblogs.com/boyiliushui/p/6014257.html
Copyright © 2020-2023  润新知