重生我是嵌入式大能之串口调试UART

什么是串口

串口是一种在数据通讯中广泛使用的通讯接口,通常我们叫做UART (通用异步收发传输器Universal Asynchronous Receiver/Transmitter),其具有数据传输速度稳定、可靠性高、适用范围广等优点。在嵌入式系统中,串口常用于与外部设备进行通讯,如传感器、液晶显示屏、WiFi模块、蓝牙模块等。

串口通信中的 TXD(Transmit Data)和 RXD(Receive Data)是串口通信中的两个重要信号。

TXD是指串口发送端的数据信号,而RXD是指串口接收端的数据信号。在串口通信中,发送端把要发送的数据发送到TXD引脚上,接收端则通过RXD引脚来接收这些数据。

TXD 发送端数据信号  RXD 接收端数据信号

TXD和RXD信号的实现方式取决于使用的芯片或模块。一般来说,它们都是通过芯片或模块的串口功能来实现的,这需要将相应的引脚连接到芯片或模块的串口引脚上。

在发送数据时,需要将要发送的数据通过串口的发送缓冲区发送到TXD引脚上,接收端通过RXD引脚接收这些数据并放入接收缓冲区中。在接收端收到完整的数据后,可以通过相应的处理进行数据的解析和处理。

需要注意的是,TXD和RXD的电平标准也需要一致,一般常见的有TTL电平和RS232电平,如果不一致则需要进行电平转换。同时,在编写程序时也需要注意串口波特率、数据位、停止位等参数的设置,以保证通信的稳定和可靠

以下是STC8H的芯片引脚介绍图

其中有4组Uart通讯口: 

串口

RXD

TXD

UART1

P3.0

P3.1

P3.6

P3.7

P1.6

P1.7

P4.3

P4.4

UART2

P1.0

P1.1

P4.6

P4.7

UART3

P0.0

P0.1

P5.0

P5.1

UART4

P0.2

P0.3

P5.2

P5.3

串口TTL通讯协议 

串口 TTL 通讯协议通常是指通过串行通信接口(TTL UART)进行数据传输的协议。这种协议通常用于连接微控制器、传感器、单片机等设备,以实现数据的收发和控制。串口 TTL 通讯协议通常包括以下几个方面:

  1. 物理连接:串口 TTL 通常使用一根或多根导线将设备连接在一起,这些导线通常包括信号线(如TX、RX)、地线(GND)和可能的控制线(如RTS、CTS)

  2. 数据格式:包括数据帧的格式,如起始位、停止位、数据位和校验位。常见的配置包括 8 位数据位、1 位停止位和无校验。

  3. 波特率:指数据传输的速率,通常以每秒传输的位数(bps)来表示,常见的波特率包括 9600、115200 等。

  4. 控制协议:有时候需要额外的控制信号或命令来启动、停止或配置通讯。这些控制信号可能包括流量控制(如硬件流控)、命令传输等。

  5. 异步串行通信:串口 TTL 使用异步串行通信协议,通过将数据分成数据帧并在首尾加上起始位和停止位来传输数据。

  6. TTL 电平:串口 TTL 使用 TTL 电平进行数据传输,其电压范围一般是 0 到 5V,需要注意不同设备之间 TTL 电平的兼容性。

 TX 用于发送数据,RX 用于接收数据,它们是串口 TTL 通信中最基本的信号

根据具体的应用场景和设备,串口 TTL 通讯协议可能会有所不同,但是通常遵循上述基本原则。例如,一些设备可能需要特定的数据格式或控制信号来实现特定的功能。

 串口转USB

串口转USB是一种常见的设备,用于连接使用串口通信协议的设备到计算机或其他设备的USB接口。这种设备通常被称为串口转USB适配器或串口转USB转换器。它的作用是将串口设备的信号转换成USB信号,使得串口设备可以通过USB接口与计算机进行通信。

串口转USB适配器通常包括以下几个部分:

  1. 串口接口:用于连接串口设备的端口,通常是RS-232或TTL接口。

  2. USB接口:用于连接计算机或其他设备的USB端口。

  3. 转换芯片:用于将串口信号转换成USB信号,以实现串口与USB之间的数据转换和通信。

  4. 驱动程序:有些串口转USB适配器需要安装特定的驱动程序才能在计算机上正常工作,这些驱动程序通常由适配器的制造商提供。

使用串口转USB适配器可以方便地将传统的串口设备连接到现代的计算机或其他设备上,实现数据传输和通信。这在很多场景下都是非常有用的,特别是在需要连接老旧设备或嵌入式系统时。

 STC8H核心板串口调试

   原理图

  • D+D-对应的usb口,和pc主机连接
  • P3.1P3.0对应的芯片
  • `采用CH340将串口和USB之间进行转换

需求:通过串口调试工具,发送消息给开发板,开发板原封不动的将消息传回。

开发步骤:

  1. 新建项目
  2. 导入库函数
  3. 编写逻辑

串口调试实现

  1. 新建项目。新建main.c文件
  2. 导入函数库。拷贝以下函数库文件到项目目录:
  3. 代码编写(发送)
#include	"Config.h"
#include	"GPIO.h"
#include	"UART.h"
#include	"Delay.h"
#include	"NVIC.h"
#include	"Switch.h"/*************	功能说明	**************
双串口全双工中断方式收发通讯程序。通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回, 默认波特率:115200,N,8,1.通过开启 UART.h 头文件里面的 UART1~UART4 定义,启动不同通道的串口通信。
******************************************//******************* IO配置函数 *******************/
void	GPIO_config(void)
{GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义GPIO_InitStructure.Pin  = GPIO_Pin_0 | GPIO_Pin_1;		//指定要初始化的IO, GPIO_Pin_0 ~ GPIO_Pin_7GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P3,&GPIO_InitStructure);	//初始化
}/***************  串口初始化函数 *****************/
void	UART_config(void)
{COMx_InitDefine		COMx_InitStructure;					//结构定义COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;	//模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTxCOMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)COMx_InitStructure.UART_BaudRate  = 115200ul;			//波特率, 一般 110 ~ 115200COMx_InitStructure.UART_RxEnable  = ENABLE;				//接收允许,   ENABLE或DISABLECOMx_InitStructure.BaudRateDouble = DISABLE;			//波特率加倍, ENABLE或DISABLEUART_Configuration(UART1, &COMx_InitStructure);		//初始化串口1 UART1,UART2,UART3,UART4NVIC_UART1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3UART1_SW(UART1_SW_P30_P31);		//UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}/**********************************************/
void main(void)
{//    EAXSFR();		/* 扩展寄存器访问使能 */GPIO_config();UART_config();EA = 1;TX1_write2buff(0x23);	// #printf("STC8H8K64U UART1 Test Programme!\r\n");	//UART1发送一个字符串PrintString1("STC8H8K64U UART1 Test Programme!\r\n");	//UART1发送一个字符串while (1){TX1_write2buff(0x2F); // /delay_ms(250);delay_ms(250);delay_ms(250);delay_ms(250);}
}
 代码编写(接收并回写)
#include "Config.h"
#include "GPIO.h"
#include "UART.h"
#include "Delay.h"
#include "NVIC.h"
#include "Switch.h"void GPIO_config(void) {GPIO_InitTypeDef	GPIO_InitStructure;		//结构定义GPIO_InitStructure.Pin  = GPIO_Pin_0 | GPIO_Pin_1;		//指定要初始化的IO, P30, P31GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PPGPIO_Inilize(GPIO_P3, &GPIO_InitStructure);//初始化
}void UART_config(void) {COMx_InitDefine		COMx_InitStructure;					//结构定义COMx_InitStructure.UART_Mode      = UART_8bit_BRTx;	//模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTxCOMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)COMx_InitStructure.UART_BaudRate  = 115200ul;			//波特率, 一般 110 ~ 115200COMx_InitStructure.UART_RxEnable  = ENABLE;				//接收允许,   ENABLE或DISABLECOMx_InitStructure.BaudRateDouble = DISABLE;			//波特率加倍, ENABLE或DISABLEUART_Configuration(UART1, &COMx_InitStructure);		//初始化串口1 UART1,UART2,UART3,UART4NVIC_UART1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3UART1_SW(UART1_SW_P30_P31);		//UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17,UART1_SW_P43_P44
}void on_uart1_recv() {u8 i;// RX_Cnt收到的数据个数(字节u8 - unsigned char)// 将收到的数据, 按字节逐个循环for(i=0; i<COM1.RX_Cnt; i++) {u8 dat = RX1_Buffer[i]; //  1 1 1 1  0 0 0 0 -> 0xF0TX1_write2buff(dat);	//收到的数据原样返回}
}
/**
开启串口调试,接收数据,把收到的数据原样返回**/
void main() {// 初始化IOGPIO_config();// 初始化UARTUART_config();// 开启中断(全局)必须要写!EA = 1;// 写一个字节TX1_write2buff(0x23);// 通过PrintString1输出字符串PrintString1("STC8H8K64U UART1 Test Programme!\r\n");	//UART1发送一个字符串// 通过printf输出字符串printf("STC8H8K64U UART1 Test Programme!\r\n");	//UART1发送一个字符串while(1) {// 超时计数// 一旦收到了一个字节数据,RX_TimeOut会初始化一个值(例如:5)if((COM1.RX_TimeOut > 0) && (--COM1.RX_TimeOut == 0)){            if(COM1.RX_Cnt > 0){// 收到数据了,on_uart1_recv();on_uart1_recv();}// 处理完数据,将数据个数清零COM1.RX_Cnt = 0;}// 注意这里delay代码的位置,属于whiledelay_ms(10);}
}
 调试

使用STC-ISP调试工具进行调试。切换好串口助手,选择正确的串口,设置和代码中相同的波特率。

通过发送区进行数据发送,通过接收区观察接收内容。

串口调试重难点

功能配置
  • 配置IO的工作模式:如果不配置工作模式,会导致串口不工作。(UART1的当前代码中的引脚P3.0P3.1默认是准双向口,可以不配置,但是不要存在侥幸心理,导致其他的串口使用中没有配置准双向口)
  • 配置UART的串口工作模式UART_Mode
    • UART_ShiftRight同步移位输出:按位传输,效率低,通常不用。
    • UART_8bit_BRTx 8位数据,可变波特率:常用。发送和接收的数据为8位。
    • UART_9bit 9位数据,固定波特率,即无法在运行时动态更改波特率。
    • UART_9bit_BRTx 9位数据,可变波特率:发送和接收的数据为9位。最后一位为奇偶校验位。
  • 配置UART的波特率RaudRate:根据实际情况来定,波特率越高,传输越快,但是出现丢帧的概率越高。通常115200就够用。单位是bit/s
  • 配置UART的波特率发生器BRT_Use:系统提供了4个发生器,通常一一对应。
    • BRT_Timer1
    • BRT_Timer2
    • BRT_Timer3
    • BRT_Timer4
  • 配置UART是否接收RxEnable:可以获取RXD接收的数据。
  • 配置UART波特率加倍BaudRateDouble:默认不加倍,配置加倍会导致波特率是设定的双倍,过高会导致丢帧。
  • 配置UART中断Interrupt和优先级Priority:UART的数据收发是通过中断实现的,如果不配置,则无法对外发送数据,TXD和RXD不工作。
  • 配置UART的端口P_SW:串口通道可以通过几组引脚来实现,但是需要指明是哪一组。
中断开启

由于uart中的发送是通过中断实现的,需要开启,但是STC8还提供了一个总的开关,如果总开关不打开,一样不起作用。

EA = 1;
UART的接收与发送

关于接收

接收是通过接收缓冲区进行接收。

在死循环中,间隔一定时间到缓冲区中去取数据,有数据,说明就是接收了

关于发送

发送是通过发送缓冲区进行发送。

发送提供了单个字节发送的API: TX1_write2buff(byte)

发送提供了字符串发送的API: PrintString1(str)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/324203.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于OpenCV对胸部CT图像的预处理

1 . 传作灵感 胸部CT中所包含的噪声比较多&#xff0c;基于OpenCV简单的做一些处理&#xff0c;降低后续模型训练的难度。 2. 图像的合成 在语义分割任务中有的时候需要将原图&#xff08;imput&#xff09;和标注数据&#xff08;groudtruth&#xff09;合成一幅图像&#x…

陪玩系统APP小程序H5音视频社交系统陪玩系统源码,陪玩app源码,陪玩源码搭建陪玩社交系统开发(现成,可定制)线下陪玩系统项目开发搭建

线下陪玩系统项目的设计 在需求分析完成后&#xff0c;接下来进行系统设计。系统设计主要包括以下几个部分&#xff1a; 1. 数据库设计&#xff1a;根据需求分析的结果&#xff0c;设计数据库结构&#xff0c;包括用户信息表、服务信息表、订单信息表等。 2. 界面设计&#…

「 网络安全常用术语解读 」SBOM主流格式CycloneDX详解

CycloneDX是软件供应链的现代标准。CycloneDX物料清单&#xff08;BOM&#xff09;可以表示软件、硬件、服务和其他类型资产的全栈库存。该规范由OWASP基金会发起并领导&#xff0c;由Ecma International标准化&#xff0c;并得到全球信息安全界的支持&#xff0c;如今CycloneD…

postman工具使用

一、配置每个接口都有公共的请求头 1.1 新建一个collect集合 my test 1.2 在pre-request script 输入配置 pm.request.addHeader("uid:24011"); pm.request.addHeader("version:2.0.0"); pm.request.addHeader("timezone:8"); pm.request.ad…

如何在 CentOS 上安装并配置 Redis

如何在 CentOS 上安装并配置 Redis 但是太阳&#xff0c;他每时每刻都是夕阳也都是旭日。当他熄灭着走下山去收尽苍凉残照之际&#xff0c;正是他在另一面燃烧着爬上山巅散烈烈朝晖之时。 ——史铁生 环境准备 本教程将在 CentOS 7 或 CentOS 8 上进行。确保你的系统已更新到最…

(三十九)第 6 章 树和二叉树(二叉树的三叉链表存储)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrc…

Github新手入门使用方法

**存在问题&#xff1a;**新手如何快速入门github&#xff0c;能够下载开源文件&#xff0c;并且修改后更新远程github仓库&#xff1b; 解决方案&#xff1a; 参考&#xff1a; http://www.360doc.com/content/24/0301/12/60419_1115656653.shtml https://blog.csdn.net/gongd…

经开区创维汽车车辆交接仪式顺利举行,守护绿色出行助力低碳发展

5月10日&#xff0c;“创维新能源汽车进机关”交车仪式于徐州顺利举行&#xff0c;20辆创维EV6 II正式交付经开区政府投入使用。经开区陈琳副书记、党政办公室副主任张驰主任、经开区公车管理平台苑忠民科长、创维汽车总裁、联合创始人吴龙八先生、创维汽车营销公司总经理饶总先…

ZOC8 for Mac v8.08.1激活版:卓越性能的SSH客户端

在远程连接和管理的世界中&#xff0c;ZOC8 for Mac以其卓越的性能和丰富的功能&#xff0c;成为了众多专业人士的首选SSH客户端。它支持SSH1、SSH2、Telnet、Rlogin、Serial等多种协议&#xff0c;让您轻松连接到远程服务器。ZOC8拥有简洁直观的界面和强大的功能设置&#xff…

【Java基础】Maven继承

1. 前言 Maven 在设计时&#xff0c;借鉴了 Java 面向对象中的继承思想&#xff0c;提出了 POM 继承思想。 2. Maven继承 当一个项目包含多个模块时&#xff0c;可以在该项目中再创建一个父模块&#xff0c;并在其 POM 中声明依赖&#xff0c;其他模块的 POM 可通过继承父模…

streamlit通过子目录访问

运行命令&#xff1a; streamlit hello 系统默认使用8501端口启动服务&#xff1a; 如果想通过子目录访问服务&#xff0c;可以这么启动服务 streamlit hello --server.baseUrlPath "app" 也可以通过以下命令换端口 streamlit hello --server.port 9999 参考&…

贪心算法----最大数

今日题目&#xff1a;leetcode179------点击跳转题目 分析&#xff1a; 要把这些数组组成最大的数&#xff0c;首先我们把数字转化为字符串&#xff0c;根据自定义的排序规则把这些字符串字数排列&#xff0c;再用一个字符串接受这些字符串数字拼接成最大的字符串数字 排序规则…

react引入阿里矢量库图标

react引入阿里矢量库图标 登录阿里矢量库&#xff0c;将项目所需的图标放一起 react项目中新建文件夹MyIcon.js 3. 在页面中引入&#xff0c;其中type为图标名称

网络流 24 题」数字梯形 【费用流、拆点】

网络流 24 题」数字梯形 思路 对于规则 1 1 1&#xff0c;要求的是点不相交且边不相交&#xff0c;我们可以把边的容量设置成 1 1 1&#xff0c;把点拆分成入点和出点&#xff0c;将其内部的容量设置成 1 1 1&#xff0c;这样就可以限制点的流量。 把相应的点之间的边的费用…

T型槽地轨承载力是如何连接整个制造过程的强力桥梁(北重公司设计)

T型槽地轨承载力的定义和计算 T型槽地轨是一种用于工业设备运输和装配的关键组件。它由世界上各行各业的生产商广泛采用&#xff0c;其有效的承载力使其成为连接整个制造过程的强力桥梁。本文将介绍T型槽地轨的承载力以及相关的设计要点和应用。 承载力的定义和计算 承载力是…

语义分割——脑肿瘤图像分割数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

Rust里的Fn/FnMut/FnOnce和闭包匿名函数关系

闭包&#xff08;英语&#xff1a;Closure&#xff09;&#xff0c;又称词法闭包&#xff08;Lexical Closure&#xff09;或函数闭包&#xff08;function closures&#xff09;&#xff0c;是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在&#xff0c;即使…

浅谈如何自我实现一个消息队列服务器(7)——编写服务器部分

文章目录 一、编写服务器代码1.1、分析一个服务器应具备的功能1.1.1、成员变量1.1.2、对外提供的接口 一、编写服务器代码 再次拿出这张图&#xff0c;前面我们已经将重要概念&#xff1a;VirtualHost、exchange、msgQueue、message、binding 都实现了&#xff0c;此时就可以开…

HTTP 1.1 与 HTTP 1.0

什么是HTTP HTTP 就是一个 超文本传输协议 协议 : 双方 约定 发送的 域名 数据长度 连接(长连接还是短连接) 格式(UTF-8那些) 传输 :数据虽然是在 A 和 B 之间传输&#xff0c;但允许中间有中转或接力。 超文本:图片、视频、压缩包,在HTTP里都是文本 HTTP 常见状态码 比如 20…

网络1--通信过程的理解

1.封装与解包 通信的过程就是不断的封装和解包的过程 封装即就是按照“应用”“传输” “网络” “链路” 层&#xff0c;封装给每一层都加上相应的包头&#xff08;每一层都有协议&#xff0c;&#xff09;解包就是接受到的包文被一层层去掉相对应的包头。 任何一层的协议都…