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

news2024/11/20 18:33:47

什么是串口

串口是一种在数据通讯中广泛使用的通讯接口,通常我们叫做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_7
    GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_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_BRTx
    COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
    COMx_InitStructure.UART_BaudRate  = 115200ul;			//波特率, 一般 110 ~ 115200
    COMx_InitStructure.UART_RxEnable  = ENABLE;				//接收允许,   ENABLE或DISABLE
    COMx_InitStructure.BaudRateDouble = DISABLE;			//波特率加倍, ENABLE或DISABLE
    UART_Configuration(UART1, &COMx_InitStructure);		//初始化串口1 UART1,UART2,UART3,UART4
    NVIC_UART1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3
    
    UART1_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, P31
    GPIO_InitStructure.Mode = GPIO_PullUp;	//指定IO的输入或输出方式,GPIO_PullUp,GPIO_HighZ,GPIO_OUT_OD,GPIO_OUT_PP
    GPIO_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_BRTx
    COMx_InitStructure.UART_BRT_Use   = BRT_Timer1;			//选择波特率发生器, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
    COMx_InitStructure.UART_BaudRate  = 115200ul;			//波特率, 一般 110 ~ 115200
    COMx_InitStructure.UART_RxEnable  = ENABLE;				//接收允许,   ENABLE或DISABLE
    COMx_InitStructure.BaudRateDouble = DISABLE;			//波特率加倍, ENABLE或DISABLE
    UART_Configuration(UART1, &COMx_InitStructure);		//初始化串口1 UART1,UART2,UART3,UART4

  	NVIC_UART1_Init(ENABLE,Priority_1);		//中断使能, ENABLE/DISABLE; 优先级(低到高) Priority_0,Priority_1,Priority_2,Priority_3

    UART1_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 -> 0xF0
        TX1_write2buff(dat);	//收到的数据原样返回
    }
}
/**
开启串口调试,接收数据,把收到的数据原样返回

**/
void main() {
    // 初始化IO
    GPIO_config();

    // 初始化UART
    UART_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代码的位置,属于while
        delay_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.coloradmin.cn/o/1661551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

串口初始化自己独立的见解--第九天

1.SM0,SM1 我们一般用 8位UART&#xff0c;波特率可变 &#xff08;方式1的工作方式&#xff09; SCON &#xff1a;SM2 一般不用&#xff0c;SM0 0 ,SM1 1 PCON : 有两位 我们不动它&#xff0c;不加速&#xff0c;初始值 TMOD&#xff1a;8位自动重装定时器&#xff0…

初识ADMM算法!ADMM算法在分布式配电网调度中的应用程序代码!

前言 随着分布式电源(distributed generation&#xff0c;DG)的渗透率不断提高&#xff0c;传统的配电网系统从被动单向的供电网络转变为功率双向流动的有源网络&#xff0c;使得配电网运行和控制面临诸多新挑战。依靠网络升级或运行结构变化等方法维持配电网可靠运行的成本高…

7 系列 FPGA 产品介绍及选型

目录 Spartan-7 FPGAsArtix-7 FPGAsKintex-7 FPGAsVirtex-7 FPGAsFPGA芯片命名规则DSP资源BRAM资源Transceivers 资源Transceivers 总带宽I/O 个数及带宽参考文档 Spartan-7 FPGAs Artix-7 FPGAs Kintex-7 FPGAs Virtex-7 FPGAs FPGA芯片命名规则 DSP资源 BRAM资源 Transceiver…

代码随想录算法训练营第六十三天|84.柱状图中最大的矩形

代码随想录算法训练营第六十三天|84.柱状图中最大的矩形 84.柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&…

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

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

【程序设计和c语言-谭浩强配套】(适合专升本、考研)

一晃大半年没更新了&#xff0c;这一年一直在备考&#xff0c;想着这几天把前段时间学的c语言给大家分享一下&#xff0c;在此做了一个专栏&#xff0c;有需要的小伙伴可私信获取o。 简介&#xff1a;本专栏所有内容皆适合专升本、考研的复习资料&#xff0c;本人手上也有日常…

在哪里打印资料比较便宜

在数字时代&#xff0c;我们常常需要在各种文档、资料之间穿梭&#xff0c;然而&#xff0c;有时候我们需要的并不是数字版&#xff0c;而是纸质版。那么&#xff0c;在哪里打印资料比较便宜呢&#xff1f; 琢贝云打印以其超低的价格&#xff0c;优质的打印服务&#xff0c;赢…

HFSS学习-day4-建模操作

通过昨天的学习&#xff0c;我们已经熟悉了HFSS的工作环境&#xff1b;今天我们来讲解HFSS中创建物体模型的县体步骤和相关操作。物体建模是HFSS仿真设计工作的第一步&#xff0c;HFSS中提供了诸如矩形、圆面、长方体圆柱体和球体等多种基本模型(Primitive)&#xff0c;这些基本…

基于SSM的文化遗产的保护与旅游开发系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的文化遗产的保护与旅游开发系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;…

[C++][数据结构]哈希2:开散列/哈希桶的介绍和简单实现

前言 接着上一篇文章&#xff0c;我们知道了闭散列的弊端是空间利用率比较低&#xff0c;希望今天学习的开散列可以帮我们解决这个问题 引入 开散列法又叫链地址法(开链法)&#xff0c;首先对关键码集合用散列函数计算散列地址**&#xff0c;具有相同地址的关键码归于同一子…

论文研读 Disentangled Information Bottleneck

解耦信息瓶颈 摘要&#xff1a; 信息瓶颈方法是一种从源随机变量中提取与预测目标随机变量相关的信息的技术&#xff0c;通常通过优化平衡压缩和预测项的IB拉格朗日乘子f来实现&#xff0c;然而拉格朗日乘子很难优化&#xff0c;需要多次实验来调整拉格朗日乘子的值&#xff0c…

《黑暗之魂》系列迎来打折:魂三标准版半价134,豪华版199

《黑暗之魂》系列游戏降价促销&#xff0c;现在是购买的好时机&#xff01;想必喜欢挑战和探索的玩家们对这个消息会特别感兴趣。让我们来看看具体的折扣信息吧&#xff01; 首先是《黑暗之魂&#xff1a;重制版》&#xff0c;原价198元&#xff0c;现价仅为99元&#xff01;这…

这份走心的母亲节礼物清单,请查收!

老舍在《我的母亲》中写道&#xff1a;“人&#xff0c;活到八九十岁&#xff0c;有母亲在&#xff0c;便可以多少还有点孩子气。失了慈母便像花插在瓶子里&#xff0c;虽然还有色有香&#xff0c;却失去了根。有母亲的人&#xff0c;心里是安定的。”母亲&#xff0c;对我们每…

【17-Ⅰ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

做好员工行为管理与监督,低门槛构建办公远程管理体系

在企业的日常办公环节&#xff0c;商用远程控制方案起到的作用是多层次的&#xff1a;它既可以作为远程办公的核心工具&#xff0c;也可以作为企业办公远程管理的必要手段&#xff0c;同时也广泛应用在企业内部日常的技术支持&#xff0c;以及关键设备的重点运维。 更加重要的…

【漫画版】指挥官的排序战术:快速排序算法解密

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任字节跳动数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python&#xff0c;欢迎探讨交流 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题…

7. 链路日志打印实现设计

前言 在前面的文章中&#xff0c;我们已经实现了一个Starter包&#xff0c;能够在使用RestTemplate作为客户端请求工具时&#xff0c;记录调用链路信息。在本文&#xff0c;将实现Jaeger框架下的链路日志打印&#xff0c;也就是提供一个io.jaegertracing.spi.Reporter来将Span…

idea运行SpringBoot项目爆红提示出现:Java HotSpot(TM) 64-Bit Server VM warning...让我来看看~

在运行SpringBoot项目的时候&#xff0c;发现总有这个警告提示出现&#xff0c;有点强迫症真的每次运行项目都很难受啊&#xff01;那么今天便来解决这个问题&#xff01; 先来看一下提示内容&#xff1a;Java HotSpot(TM) 64-Bit Server VM warning: Options -Xverify:none an…

kaldi学习参考

HMM模型 https://www.cnblogs.com/baixf-xyz/p/16777438.htmlhttps://www.cnblogs.com/baixf-xyz/p/16777438.htmlGMM-HMM 基于GMM-HMM的语音识别系统https://www.cnblogs.com/baixf-xyz/p/16777439.html https://www.cnblogs.com/baixf-xyz/p/16777426.htmlhttps://www.cnbl…

Tomcat中服务启动失败,如何查看启动失败日志?

1. 查看 localhost.log 这个日志文件通常包含有关特定 web 应用的详细错误信息。运行以下命令查看 localhost.log 中的错误&#xff1a; sudo tail -n 100 /opt/tomcat/latest/logs/localhost.YYYY-MM-DD.log请替换 YYYY-MM-DD 为当前日期&#xff0c;或选择最近的日志文件日…