当前位置: 首页 > news >正文

HarmonyOS系统中内核实现UART串口通信方法

        大家好,今天主要聊一聊,如何使用鸿蒙系统实现UART数据的读写方法。

 

目录

第一:串口通信基本原理     

第二:鸿蒙UART API分析

第三:硬件设计

 第四:软件设计

第五:编译调试

第六:运行结果


第一:串口通信基本原理     

1、同步通信(SYNC-synchronous data communication)

     同步通信有时钟信号来做同步,在约定的通信速率下,发送端和接收端的时钟信号频率和相位始终保持一致(同步),这样就保证了通信双方在发送和接收时具有完全一致的定时关系;

同步串行通信SPI(Serial Peripheral Interface串行外围设备接口简称),SPI总线系统是一种同步串行的外设接口,它可以是MCU与各种外围设备以串行方式进行通信以交换信息。

2、异步通信(ASYNC-asynchronous data communication)

     以字符为单位进行传输,字符之间没有固定的时间间隔要求,而每个字符中的各位则固定的时间传送。异步通信中,收发双方去的同步是通过在字符格式中设置起始位和停止位的方式来实现的。具体来说就是,在一个有效字符正式发送之前,发送器先发送一个起始位,然后发送有效字符位,在字符结束时再发送一个停止位,起始位和停止位构成一帧。停止位和下一个起始位之间是不定长的空闲位,并且规定起始位为低电平(逻辑值为0),停止位和空闲位都是高电平(逻辑值为1),这样就保证了起始位开始处一定会有一个下跳沿,由此就可以标志一个字符传输的起始;根据起始位和停止位就很容易的实现了字符的界定和同步。

异步串行通信UART(无时钟信号)(UniverSal Asynchronous Receiver/Transmitter),即通用异步接收/发送;

UART包含TTL电平和RS232电平,TTL电平是3.3V的,RS232是负逻辑电平,它定义+3 ~ +15为低电平,而-15 ~ -3为高电平,通常PC机串口与单片机串口通信需要电平转换芯片,例如:MAX232;

显然,采用异步通信时,发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,可以互不同步
 

第二:鸿蒙UART API分析

UartInit()

unsigned int UartInit (WifiIotUartIdx id, const WifiIotUartAttribute * param, const WifiIotUartExtraAttr * extraAttr )

功能描述:

配置一个UART设备。 参数:

名字描述
idUART端口号.
param表示基本UART属性
extraAttr表示扩展UART属性

UartWrite()

int UartWrite (WifiIotUartIdx id, const unsigned char * data, unsigned int dataLen )

功能描述:将数据写入UART设备

参数:

名字描述
idUART端口号.
data表示指向要写入数据的起始地址的指针
dataLen表示读取数据的长度

UartRead()

int UartRead (WifiIotUartIdx id, unsigned char * data, unsigned int dataLen )

功能描述:

从UART设备读取数据。

参数:

名字描述
idUART端口号.
data表示指向要读取数据的起始地址的指针
dataLen表示读取数据的长度

第三:硬件设计

  本实例使用鸿蒙开发板的UART作为测试,如原理图所示第 18 和 19 脚分别为 TXD 和 RXD ,连接了主控芯片的 GPIO_6 和 GPIO_5 ,所以在编写软件的时候需要将 GPIO_6 和 GPIO_5 分别复用为 TXD 和 RXD 。

 第四:软件设计

这部分代码为UART初始化的代码,首先要在 uart_attr 结构体这配置波特率、数据位、停止位、奇偶检验位,然后通过 UartInit() 函数对串口1进行配置。

WifiIotUartAttribute uart_attr = {
    .baudRate = 9600, /* baud_rate: 9600 */
    .dataBits = 8,      /* data_bits: 8bits */
    .stopBits = 1,
    .parity = 0,
};

/* Initialize uart driver */
ret = UartInit(WIFI_IOT_UART_IDX_1, &uart_attr, NULL);
if (ret != WIFI_IOT_SUCCESS) {
    printf("Failed to init uart! Err code = %d\n", ret);
    return;
}

这部分的代码主要实现通过 UartWrite() 函数在串口1发送一串数据,然后通过 UartRead() 函数将数据都回来,并通过 debug 串口打印出来。

UartWrite(WIFI_IOT_UART_IDX_1, (unsigned char *)data, strlen(data));    // 通过串口1发送数据
UartRead(WIFI_IOT_UART_IDX_1,uart_buff_ptr,UART_BUFF_SIZE);             // 通过串口1接收数据
printf("%s",uart_buff_ptr);

第五:编译调试

   修改BUILD.gn

   修改 applications\BearPi\BearPi-HM_Nano\sample 路径下 BUILD.gn 文件,指定 uart_example 参与编译。

#"B1_basic_led_blink:led_example",
#"B2_basic_button:button_example",
#"B3_basic_pwm_led:pwm_example",
#"B4_basic_adc:adc_example",
#"B5_basic_i2c_nfc:i2c_example",
"B6_basic_uart:uart_example",

第六:运行结果

示例代码编译烧录代码后,按下开发板的RESET按键, 将开发板上E53接口的UART_TX和UART_RX用杜邦线短接 通过串口助手查看日志,串口1实现自发自收。

=======================================
*************UART_example**************
=======================================
Uart1 read data:Hello, BearPi!
=======================================
*************UART_example**************
=======================================
Uart1 read data:Hello, BearPi!

相关文章:

  • Selenium4.0+Python三种元素等待方式介绍 及 元素等待封装
  • django梳理
  • 嵌入式软件调试的发展历程
  • PT_连续型随机变量/分布函数/概率密度
  • Python告别pip手动安装模块,实现全自动安装第三方库,彻底解放你的双手
  • 文件目录操作——Linux命令核心
  • Taichi 加速 Python 中图像处理
  • Vue--》MVVM模型在Vue中的使用
  • 迷宫求解(云南大学)
  • 【夜读】坚持这5个习惯,遇见更优秀的自己
  • 算法与数据结构【30天】集训营——平衡二叉树的LL、RR、LR、RL调整的简单快速方法(16)
  • Java本地搭建宝塔部署实战医药WMS进销存源码
  • 基于meanshift算法的目标聚类和目标跟踪matlab仿真
  • Google Earth Engine ——把reducer统计的数据分别放在不同的列表中打印出来,使用unzip()函数
  • Ubuntu 18.04 LTS PWN安装
  • 2017-09-12 前端日报
  • Centos6.8 使用rpm安装mysql5.7
  • HomeBrew常规使用教程
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • VuePress 静态网站生成
  • XML已死 ?
  • 测试开发系类之接口自动化测试
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 聊聊flink的BlobWriter
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 删除表内多余的重复数据
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 数据仓库的几种建模方法
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 用 Swift 编写面向协议的视图
  • 原生 js 实现移动端 Touch 滑动反弹
  • ionic异常记录
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​一些不规范的GTID使用场景
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (搬运以学习)flask 上下文的实现
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转载)OpenStack Hacker养成指南
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net 无限分类
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET中两种OCR方式对比
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • @Autowired @Resource @Qualifier的区别