11_UART串口

2023-05-16

11_UART

文章目录

  • 11_UART
  • 1、串口连接芯片图
  • 2、串口传输一个字节的过程
  • 3、发送接收过程
  • 4、编写UART函数
    • 4.1、初始化函数uart0_init()
      • 4.1.1、设置引脚用于串口
      • 4.1.2、使能上拉
      • 4.1.3、设置波特率
      • 4.1.4、设置数据格式
    • 4.2、int putchar(int c)函数
      • 4.2.1、判断状态
      • 4.2.2、发送数据
    • 4.3、int getchar(void)函数
      • 4.3.1、判断状态
      • 4.3.2、返回接收到的数据
    • 4.4、int puts(const char *s)函数
  • 5、UART头文件
  • 6、main函数
  • 7、编写自己的printf测试函数

串口打印调试信息,外界各种设备

1、串口连接芯片图

在这里插入图片描述

2、串口传输一个字节的过程

在这里插入图片描述
传输数据时的逻辑电平如下两图:
在这里插入图片描述
在这里插入图片描述

3、发送接收过程

在这里插入图片描述
波特率:115200,8n1
每一位:t = 1/115200
传输1Byte:需要10位(start, Data, Stop)
t = 10 / 115200
1秒能传输:1/t = 115200/10 = 11520 byte

4、编写UART函数

4.1、初始化函数uart0_init()

编写初始化函数:void uart0_init()

4.1.1、设置引脚用于串口

//GPH2,3用于TxD0,RxD0 
GPHCON &= ~((3<<4) | (3<<6));
GPHCON |=  ((2<<4) | (2<<6));

4.1.2、使能上拉

//使能内部上拉使得引脚在平时为高电平
GPHUP &= ~((1<<2) | (1<<3));

4.1.3、设置波特率

设置UCON0寄存器
UBRDIV0 = (int)( UART clock / ( buad rate x 16) )1
UART clock = PCLK = 50MHz
UBRDIV0 = (int)( 50000000 / ( 115200 x 16) )1 = 26

UCON0 = 0x00000005;
/* PCLK,中断/查询模式 
* UCON0[11:10] = 00(0x00000005),10(0x00000805) :选为PCLK
* UOCN0[3:2] = 01,Interrupt request or polling mode
* UOCN0[1:0] = 01,Interrupt request or polling mode
*/

4.1.4、设置数据格式

ULCON0 = 0x00000003;
/* 8n1: 8个数据位,无校验位,一个停止位 
* ULCON0[5:4:3] = 0xx :No parity(无校验位)
* ULCON0[2] = 0 :One stop bit per frame(一个停止位)
* ULCON0[1:0] = 11 :8-bits(8个数据位)
*/

4.2、int putchar(int c)函数

4.2.1、判断状态

while (!(UTRSTAT0 & (1<<2)));
此位为0表明上一次的数据还没发送出去,等待。

4.2.2、发送数据

UTXH0 = (unsigned char)c;
寄存器UTXH0定义为unsigned char类型。

4.3、int getchar(void)函数

4.3.1、判断状态

while (!(UTRSTAT0 & (1<<0)));	
此位为0表明上一次的数据还没接收,等待。

4.3.2、返回接收到的数据

	return 	URXH0;

4.4、int puts(const char *s)函数

输出字符串函数:
	while(*s)
	{
		putchar(*s);
		s++;
	}

5、UART头文件

//uart.h
#ifndef _UART_H
#define _UART_H
void uart0_init();
int putchar(int c);
int getchar(void);
int puts(const char *s);
#endif

6、main函数

#include "s3c2440_soc.h"
#include "uart.h"
int main(void) 
{
	unsigned char c;
	uart0_init();
	puts("Hello,world!\n\r");
	while(1) {
		c = getchar();
		if (c == '\r') {
			putchar('\n');
		}
		if (c == '\n') {
			putchar('\r');
		}		
		putchar(c);	/* 若无这个则串口不显示输入的字符,即没有回显 */
	}
	return 0;
}

7、编写自己的printf测试函数

Printf中的格式字符:
在这里插入图片描述
my_printf测试函数:

#include <stdio.h>
//#include <stdarg.h>

typedef char *  va_list;
#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
#define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )
//#define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
//#define va_arg(ap,t)	(ap = ap +_INTSIZEOF(t), *(t *)(ap -_INTSIZEOF(t)))
#define va_arg(ap,t)	(*(t *)(ap = ap +_INTSIZEOF(t),ap -_INTSIZEOF(t)))

#define va_end(ap)      ( ap = (va_list)0 )

struct person{
	char *name;
	int age;
	char score;
	int id;
}; 

/* 由于在x86(32位机器)平台下,GCC编译器默认按4字节对齐 */
/*int printf(ocnst char *formt, ...);
 *依据: x86平台,函数调用参数是使用堆栈来实现的
 *目的: 将所有传入的参数全部打印出来
 */
int push_test(const char *format, ...)
{
	//char *p = (char *)&format;
	int i;
	struct person per;
	char c;
	double d;//float d;
	va_list p;
	
	//1==========================
	/* 指针对连续空间操作时: 1)取值 2)移动指针 */	
	printf("arg1: %s\n",format);
		
	//2==========================
	//p = p +sizeof(char *);
	va_start(p, format);
	/* 指针对连续空间操作时: 1)取值 2)移动指针 */
	//i = *((int *)p);
	//p = p + sizeof(int);
	i = va_arg(p, int);
	printf("arg2: %d\n",i);

	//3==========================
	/* 指针对连续空间操作时: 1)取值 2)移动指针 */	
	//per = *((struct person *)p);
	//p = p + sizeof(struct person);
	per =  va_arg(p, struct person);
	printf("arg3: .name = %s, .age = %d, .score= %c, .id=%d\n",\
		       per.name,   per.age,   per.score,  per.id);

	//4==========================
	/* 指针对连续空间操作时: 1)取值 2)移动指针 */
	//c = *((char *)p);
	/* p = p + ((sizeof(char) + 3) & ~3); 
	 * #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
	 * 当sizeof(n)=1/2/4时,_INTSIZEOF(n)都等于4
	 */	
	c = va_arg(p, int); /*c = va_arg(p, char);
	                由于传递参数时保持字符对齐,
	                需要把char类型转换成int类型*/
	printf("arg4: %c\n",c);

	//5==========================
	/* 指针对连续空间操作时: 1)取值 2)移动指针 */	
	//d = *((double *)p); /* 默认按照doubled = *((float *)p); */
	//p = p + sizeof(double);
	d = va_arg(p, double);

	/* 避免"野指针"出现 */
	//p = (char *)0;
	va_end( p );
	printf("arg5: %f\n",d);
	
	return 0;
}

int main(int argc,char **argv)
{
	struct person per={"Zhang Dengyu",23,'A',191040043};

	printf("sizeof(char   )=%d\n",sizeof(char   ));
	printf("sizeof(int    )=%d\n",sizeof(int    ));
	printf("sizeof(char  *)=%d\n",sizeof(char  *));
	printf("sizeof(char **)=%d\n",sizeof(char **));	
	printf("sizeof(struct person)=%d\n",sizeof(struct person));	

	//push_test("HDU_DZ_ZDY");
	//push_test("HDU_DZ_ZDY",8023);
	//push_test("HDU_DZ_ZDY",8023,per);	
	//push_test("HDU_DZ_ZDY",8023,per,'c');
	push_test("HDU_DZ_ZDY",8023,per,'c',3.14);	
	
	return 0;
}	

代码解析:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

11_UART串口 的相关文章

  • Jetson nano串口的使用——UART

    UART串口使用两条杜邦线就可以实现数据发送和接收 xff0c 可以很方便的与其他扩展进行数据连接 xff0c 比如微雪的L76X GPS HAT就可以直接连接40Pin的GPIO接口通过UART串口进行数据传递 接下来具体说明Jetson
  • 【IoT开发】UART通信高频测试

    测试所使用芯片 STM32F103RCT6 UART收发的极限频率 xff1a bytes s 1 发送频率 主程序循环发送一字节u8整型 xff0c 记录次数 while 1 t 43 43 if t 61 61 255 t 61 0 p
  • FPGA学习-UART串口发送单字节(UART时序分析+真正的FPGA设计看图写代码)

    首先看UART发送时序图 xff1a 要发送一个完整字节 xff0c 需要 1位起始位 43 8位数据位 43 1位停止位 xff0c 图上的第11位 xff0c 是确认一个字节发送完的一位 重点是每一位之间的发送时间需要保持一致 xff0
  • 串口通信基础知识(UART)

    目录 一 串口通信的具体分类 xff1a 二 常见的串行通信接口简介 xff1a 三 具体通信标准的实现 xff1a 1 UART xff08 通用异步收发传输器 xff09 xff1a 一 串口通信的具体分类 xff1a 总结一下 xff
  • 【STM32】UART串口通信详解

    目录 一 数据通信方式 1 串行与并行通信2 全双工 半双工及单工通讯3 同步通讯与异步通讯 二 串口通讯协议 STM32串口简介1 物理层1 RS232标准2 USB转串口 重点 3原生的串口到串口2 协议层1 xff09 通讯的起始和停
  • 串口通信UART

    串口基本概念 串口通讯 Serial Communication 是指外设和计算机间 xff0c 通过数据信号线 地线等 xff0c 按位进行传输数据的一种通讯方式 其通讯协议可分层为协议层和物理层 物理层规定通信协议中具有机械 电子功能的
  • UART+DMA数据传输

    DMA的概念 DMA xff08 Direct Memory Access xff09 即直接内存访问 xff0c DMA传输方式无需CPU直接控制传输 xff0c 通过硬件为RAM I O设备开辟一条直接传输数据的通路 xff0c 能使C
  • 1、串口(UART/COM/TTL/RS232/RS485)

    目录 串口简介 串行通讯制式 UART 2 1 简介 2 2 电平标准 TTL RS232 RS485 2 3 电平转换 xff08 重点讲解RS232 TTL xff09 USB转TTL USB转RS232 USB转RS485 RS232
  • UART

    一 S3C2410内置的UART控制器 S3C2410内部具有3个独立的UART控制器 xff0c 每个控制器都可以工作在Interrupt xff08 中断 xff09 模式或DMA xff08 直接内存访问 xff09 模式 xff0c
  • arduino学习——UART串口通信

    Serial begin 初始化串口 用作串口的启动 xff0c 常放置在setup xff08 xff09 中 原型 xff1a Serial begin speed Serial begin speed config 参数 xff1a
  • 串口发送通信---UART发送---STM32F4实现

    串口发送程序配置过程 xff08 HAL库 xff09 初始化串口相关参数 xff0c 使能串口 HAL StatusTypeDef span class token function HAL UART Init span span cla
  • UART串口通信协议详解

    UART xff1a 通信异步收发器 xff0c 串行 异步通信总线 xff0c 两条数据线 xff08 收发 xff09 xff0c 全双工 xff08 可以同时接收和发送 xff09 一 UART帧格式 xff08 UART协议 xff
  • MCU-串口通信协议

    MCU 串口通信协议 一 介绍 串行通信就像单车道 所有数据得一个一个通行 并行就像多车道 一次可以通行多辆车 MCU常用到的串口通信模块主要有两种 UART和USART UART 全称是Universal Asynchronous Rec
  • Node.js笔记:SerialPort(串口)模块使用(基于9.x.x)

    文章目录 目的 模块安装 基础使用 扫描端口 打开端口 发送数据 接收数据 错误处理 数据解析器 SerialPort类 构造方法 属性 事件 方法 命令行工具 总结 目的 上位机与各种电路模块间常常采用串口进行通讯 Node js中可以使
  • 51单片机串口通信(UART)

    项目描述 1 串口工作方式为1 8位UART 波特率可变 无校验位 2 通信数据格式为 1位起始位 8位数据位 1位停止位 3 上电后MCU给上位机发送问候语 之后等待上位机的信息 MCU和上位机的通信为收发交替进行 MCU接收到的信息会实
  • MicroPython串口数据转换技巧

    技巧一 还原从串口接收的HEX字符串 首先上官方文档 确认接收数据类型为bytes 串口读来的bytes类型HEX数据转换成HEX类型字符串转换函数 ByteToHex的转换 返回数据16进制字符串 def ByteToHex bins r
  • UART串口协议

    通用异步收发传输器 Universal Asynchronous Receiver Transmitter 通常称作UATR 是一种异步收发传输器 将数据由串行通信与并行通信间做传输转换 作为并行输入称为串行输出的芯片 UART是一种通用串
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • 通过 USB 模拟 UART

    有谁知道是否可以通过 USB 模拟 UART 简单串行发送和接收 这将如何实现 我在 Microchip 网站上找到了这个链接 但不是很容易找到 http www microchip com forums m522571 print asp
  • 如何检测来自 QNX 中 ncurses 的屏幕调整大小事件?

    我无法配置为接收有关使用 ncurses QNX Momentics 更改终端大小的事件 我使用Putyy作为终端 通过COM端口传输数据 我的问题是如何实现使用远程终端时接收屏幕变化事件 FILE fcons fopen dev ser1

随机推荐

  • ssh远程登录报错:kex_exchange_identification: Connection closed by remote host

    基本信息 系统 xff1a MacOS Catalina 10 15 7 报错信息 xff1a 终端登录远程 服务器 时报错 xff1a kex exchange identification Connection closed by re
  • 如何在Windows的cmd下让程序在后台执行

    如何在Windows的cmd下让程序在后台执行 xff1f Hu Dennis 2008 12 24 在windows下启动JBoss服务器 xff0c 需要在命令行中输入run bat 但是运行后如果你想停止服务器 xff0c 可能的做法
  • 嵌入式LINUX识别U盘的问题

    我试过mount U盘 当开机后mount 第一个U盘时 xff0c 一般设备名为sda xff0c 然后umount xff0c 并重插另外一个U盘 xff0c 再mount xff0c 发现设备名变为sdb了 此试验进行了几次 xff0
  • yolov4+deepsort(yolo目标检测+自适应卡尔曼滤波追踪+毕业设计代码)

    项目介绍 该项目一个基于深度学习和目标跟踪算法的项目 xff0c 主要用于实现视频中的目标检测和跟踪 该项目使用了 YOLOv4 目标检测算法和 DeepSORT 目标跟踪算法 xff0c 以及一些辅助工具和库 xff0c 可以帮助用户快速
  • 集成学习(含常用案列)

    集成学习原理 xff1a 工作原理是生成多个分类器 模型 xff0c 各自独立地学习和作出预测 这些预测最后结合成组合预测 xff0c 因此优于任何一个单分类的做出预测 集成学习算法分类 xff1a 集成学习算法一般分为 xff1a bag
  • 字节序与比特序详解

    字节序的定义 几种类型的字节序 cpu字节序外部bus字节序设备字节序网络协议字节序 Ethernet协议字节序IP协议字节序 编译字节序 比特序的定义字节序与bit序的转换结构体的位域 字节序的定义 字节序就是说一个对象的多个字节在内存中
  • 【动态规划】01背包问题

    问题描述 有n个物品 xff0c 它们有各自的体积和价值 xff0c 现有给定容量的背包 xff0c 如何让背包里装入的物品具有最大的价值总和 xff1f 为方便讲解和理解 xff0c 下面讲述的例子均先用具体的数字代入 xff0c 即 x
  • 献给初学labview数据采集的初学者

    前言 xff1a 参考来源 xff1a http bbs elecfans com jishu 209658 1 5 html xff0c 感谢原作者 zhihuizhou 这里的内容只针对NI的数据采集卡 xff0c 不保证适用于其它公司
  • 如何从科学论文中实现一个算法

    原文 xff1a http codecapsule com 2012 01 18 how to implement a paper 作者 xff1a Emmanuel Goossaert 本文是从科学论文中实现算法的简短指南 我从书籍和科学
  • 国内C/C++刷题网站汇总

    作者 xff1a Luau Lawrence 链接 xff1a https www zhihu com question 25574458 answer 31175374 来源 xff1a 知乎 Welcome To PKU JudgeOn
  • 华为16道经典面试题

    面试过程中 xff0c 面试官会向应聘者发问 xff0c 而应聘者的 回答将成为面试官考虑是否接受他的重要依据 对应聘者而言 xff0c 了解这些问题背后的 猫腻 至关重要 本文对面试中经常出现的一些典型问题进行了整理 xff0c 并给出相
  • 语音信号的预加重和加窗处理

    原文转载于 xff1a http blog csdn net ziyuzhao123 article details 12004603 非常感谢 一 语音信号的预加重 语音信号的预加重 xff0c 目的是为了对语音的高频部分进行加重 xff
  • 单独编译和使用webrtc音频增益模块(AGC)

    原文转载于 xff1a http www cnblogs com mod109 p 5767867 html top 非常感谢 webrtc的音频处理模块分为降噪ns xff08 nsx xff09 xff0c 回音消除aec xff08
  • 功率谱和频谱的区别

    生活中很多东西之间都依靠信号的传播 xff0c 信号的传播都是看不见的 xff0c 但是它以波的形式存在着 xff0c 这类信号会产生功率 xff0c 单位频带的信号功率就被称之为功率谱 它可以显示在一定的区域中信号功率随着频率变化的分布情
  • 如何解决在rviz中,路径规划导航时,点击2D Pose estimate后机器人位置没有改变,终端也没有反应的问题

    在rviz中 xff0c 点击2D Pose estimate后机器人位置没有改变 xff0c 终端也没有反应 xff0c 通常这种情况就是由于客户端和服务端IP地址不一致导致的 xff0c IP地址有时候系统会自动变更 xff0c 这里我
  • 五款免费开源的语音识别工具

    按 xff1a 本文原作者 Cindi Thompson xff0c 美国德克萨斯大学奥斯汀分校 xff08 University of Texas at Austin xff09 计算机科学博士 xff0c 数据科学咨询公司硅谷数据科学
  • 动态内存分配

    动态内存分配 常见的内存分配的错误 先上一个内存分配的思维导图 便于联想想象 xff0c 理解 xff1a 首先我们介绍一下内存分配的方式 xff1a 1 在静态存储区域中进行分配 内存在程序编译的时候就已经分配好 xff0c 这块内存在程
  • UEFI架构

    UEFI架构 UEFI提供系统化的标准方法 xff0c 加载驱动并管理他们之间的交互 前言 xff1a 感谢uefi blog UEFI 提供了一个标准接口 xff0c 以便在硬件发生变更时固件能提供足够信息而保证操作系统不受影响 它包含有
  • C++调试工具(未完)

    C 43 43 调试相关命令 ld so conf https blog csdn net Bruce 0712 article details 78816790相关的命令 ar nm 目标格式文件分析 xff0c 所以也可以分析 a文件
  • 11_UART串口

    11 UART 文章目录 11 UART1 串口连接芯片图2 串口传输一个字节的过程3 发送接收过程4 编写UART函数4 1 初始化函数uart0 init 4 1 1 设置引脚用于串口4 1 2 使能上拉4 1 3 设置波特率4 1 4