迪文科技论坛

 找回密码
 立即注册
搜索
查看: 111|回复: 1

【分享】UART串口通信学习与分享

[复制链接]

2

主题

0

回帖

35

积分

新手上路

Rank: 1

积分
35
发表于 2024-12-19 19:28:21 | 显示全部楼层 |阅读模式




      串口通信是一种常见且重要的通信方式,在很多嵌入式系统中都有广泛应用。本次实验的主要目的是利用 T5L 芯片实现串口数据的收发功能,通过与外部设备(如电脑串口调试助手)进行通信,验证 T5L 芯片串口通信的正确性和稳定性,同时掌握在 T5L 芯片上进行串口通信编程的基本方法和技巧。
二、实验原理
      T5L 芯片的串口通信基于其内部[color=var(--md-box-samantha-normal-text-color)]的串口模块,通过配置相关寄存器来实现特定的通信参数,如波特率、数据位、停止位和校验位等。在本次实验中,我们将使用串口 2 进行通信。三、代码实现

  • 首先,我们需要引入必要的头文件,在代码中包含了 "sys.h" 和 "uart2.h"。sys.h 头文件可能包含了系统相关的配置、通用类型定义以及与整个系统初始化等相关的函数声明等内容,为后续系统初始化和一些通用操作提供支持。uart2.h 则主要用于串口 2 操作相关的函数声明、寄存器定义、宏定义等,使得我们能够方便地对串口 2 进行配置和数据收发操作。
  • 在 main 函数中,我们首先定义了一个 u16 类型的变量 len,用于后续记录串口数据包的长度等信息。
    接着,调用 sys_init 函数进行系统初始化,这一步是确保整个系统能够正常运行的基础,可能涉及到时钟配置、引脚复用设置、中断初始化等各种与系统相关的操作。然后,通过 uart2_init(115200) 函数初始化串口 2,将其波特率设置为 115200bps,这是一个常见的波特率值,能够满足大多数串口通信的需求。

  • 在主循环 while(1) 中,通过 if(uart2_rx_sta&UART2_PACKET_OK) 判断串口 2 是否接收到了完整的数据包。这里 uart2_rx_sta 是用于记录串口 2 接收状态的变量,UART2_PACKET_OK 应该是一个宏定义,用于表示数据包接收完成的标志位。
    如果接收到了数据包,首先通过 len = uart2_rx_sta&UART2_PACKET_LEN; 获取数据包的长度(不包含结束符的长度)。然后,uart2_buf[len++] = 0; 和 uart2_buf[len++] = 0; 在数据包末尾添加两个空字符,这可能是为了遵循某种字符串处理规范或者适配后续函数对字符串格式的要求。
    接着,printf("T5L_C51:%s\r\n",uart2_buf); 将接收到的数据包加上 "T5L_C51:" 前缀后通过串口回显给发送者,这里的 printf 函数在底层应该是通过串口输出实现的。同时,sys_write_vp(0x2000,uart2_buf,len/2+1); 函数将数据包显示到界面上(具体的显示方式取决于 sys_write_vp 函数的实现)。最后,uart2_rx_sta = 0; 将接收状态标志位清零,以便准备处理下一次接收的数据。
四、实验步骤与结果
  • 本次需要用到一个xcom软件,以及一个USB 转 TTL(CH340)接口。
  • 将编写好的代码下载到 T5L 芯片中并运行。
  • 在电脑xcom软件上设置好与 T5L 芯片串口 2 相同的通信参数(波特率 115200bps、数据位、停止位和校验位等),然后发送数据。可以观察到能够正确接收数据。
五、注意事项
  • 在配置串口参数时,要确保与外部设备(如电脑串口调试助手)的参数一致,否则无法正常通信。
  • 对于 uart2_rx_sta 和相关宏定义(如 UART2_PACKET_OK、UART2_PACKET_LEN)的理解和使用要准确,这些是判断串口接收状态和获取数据包信息的关键。
  • 在添加空字符和处理数据包长度时,要根据实际需求和后续函数的要求进行合理操作,避免出现数据格式错误等问题。

通过本次 T5L 芯片串口通信实验了解了串口通信在 T5L 芯片上的实现方式,希望大家在自己的实验和项目中能够灵活运用串口通信功能,实现更加复杂和有趣的功能。不知道大家在进行 T5L 芯片串口通信实验时有没有遇到其他问题或者有不同的见解呢?欢迎大家一起交流讨论!
  1. #include "sys.h"
  2. #include "uart2.h"

  3. void main(void)
  4.    {
  5.     u16 len;

  6.     sys_init();//系统初始化
  7.     uart2_init(115200);//初始化串口2

  8.     while(1)
  9.     {
  10.     if(uart2_rx_sta&UART2_PACKET_OK)//接受到了串口数据包
  11.     {
  12.         len = uart2_rx_sta&UART2_PACKET_LEN;//得到串口数据包的长度,不包含"\r\n"或者'\n'结束符的长度
  13.         uart2_buf[len++] = 0;//在末尾添加2个空字符
  14.         uart2_buf[len++] = 0;

  15.         printf("T5L_C51:%s\r\n",uart2_buf);//把接受到的数据包加上"T5L_C51:"前缀后返还给发送者
  16.         sys_write_vp(0x2000,uart2_buf,len/2+1);//同时把数据包显示到界面上

  17.         uart2_rx_sta = 0;//清0代表处理掉了此串口包
  18.     }
  19. }
  20. }

复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0

主题

3

回帖

67

积分

注册会员

Rank: 2

积分
67
发表于 昨天 17:04 | 显示全部楼层
与51单片机通信的话,触摸屏发送0x01,单片机的SBUF接收就是0x01吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2025-5-16 01:56 , Processed in 0.067988 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表