0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【产品应用】AWorksLP 样例详解(MR6450)——UART

ZLG致远电子 2023-01-06 10:07 次阅读

AWorksLP 对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以MR6450平台为例,介绍AWorksLP UART 外设基本用法。

30980cf6-8c2c-11ed-bcbd-dac502259ad0.jpg  简介

UART(Universal Asynchronous Receiver/Transmitter)是一种通用异步收发传输器,其使用串行的方式在双机之间进行数据交换,实现全双工通信。数据引脚仅包含用于接收数据的RXD和用于发送数据的TXD。数据在数据线上一位一位的串行传输,要正确解析这些数据,必须遵循UART协议,以下简述几个关键的概念:

  • 波特率

波特率决定了数据传输速率,其表示每秒传送数据的位数,值越大,数据通信的速率越高,数据传输得越快。常见的波特率有4800、9600、14400、19200、38400、115200等等,若波特率为115200,则表示每秒钟可以传输115200位(注意:是bit,不是byte)数据。

  • 空闲位

数据线上没有数据传输时,数据线处于空闲状态。空闲状态的电平逻辑为“1”。

  • 起始位起始位表示一帧数据传输的开始,起始位的电平逻辑是“0”。

数据位

  • 紧接起始位后,即为实际通信传输的数据,数据的位数可以是5、6、7、8等,数据传输时,从最低位开始依次传输。

奇偶校验位

  • 奇偶校验位用于接收方对数据进行校验,及时发现由于通信故障等问题造成的错误数据。奇偶校验位是可选的,可以不使用奇偶校验位。奇偶校验有奇校验和偶校验两种形式,该位的逻辑电平与校验方法和所有数据位中逻辑“1”的个数相关。

1. 奇校验:通过设置该位的值(“1”或“0”),使该位和数据位中逻辑“1”的总个数为奇数。例如,数据位为8位,值为:10011001,“1”的个数为4个(偶数),则奇校验时,为了使“1”的个数为奇数,就要设置奇偶校验位的值为“1”,使“1”的总个数为5个(奇数)。

2. 偶校验:通过设置该位的值(“1”或“0”),使该位和数据位中逻辑“1”的总个数为偶数。例如,数据位为8位,值为:10011001,“1”的个数为4个(偶数),则偶校验时,为了使“1”的个数为偶数,就要设置奇偶校验位的值为0,使“1”的个数保持不变,为4(偶数)。

通信双方使用的校验方法应该一致,接收方通过判断“1”的个数是否为奇数(奇校验)或偶数(偶校验)来判定数据在通信过程中是否出错。

停止位

  • 停止位表示一帧数据的结束,其电平逻辑为“1”,其宽度可以是1位、1.5位、2位。即其持续的时间为位数乘以传输一位的时间(由波特率决定),例如,波特率为115200,则传输一位的时间为1/115200秒,约为8.68us。若停止位的宽度为1.5位,则表示停止位持续的时间为:1.5 × 8.68us ≈ 13us。

常见的帧格式为:1位起始位,8位数据位,无校验,1位停止位。由于起始位的宽度恒为1位,不会变化,而数据位,校验位和停止位都是可变的,因此,往往在描述串口通信协议时,都只是描述其波特率、数据位,校验位和停止位,不再单独说明起始位。

注意:

通信双方必须使用完全相同的配置,包括波特率、起始位、数据位、停止位等。如果配置不一致,则通信数据会错乱,不能正常通信。在通信中,若出现乱码的情况,应该首先检查通信双方所使用的配置是否一致。


30a5e056-8c2c-11ed-bcbd-dac502259ad0.jpg  接口介绍

表1 函数列表

函数原型

简要描述

aw_err_t aw_serial_flush_read (int fd);

串口刷新读取

aw_err_t aw_serial_dcb_set (int fd, const struct aw_serial_dcb *p_dcb);

配置串口设备参数

aw_err_t aw_serial_dcb_get (int fd, struct aw_serial_dcb *p_dcb);

获取串口设备配置参数

aw_err_t aw_serial_timeout_set (int fd, struct aw_serial_timeout *p_cfg);

配置超时参数

aw_err_t aw_serial_timeout_get (int fd, struct aw_serial_timeout *p_cfg);

获取超时参数

下表为UART接口相关结构体类型。表2 结构体类型表

类型

简要描述

struct aw_serial_dcb

串口配置结构描述

struct aw_serial_timeout

串口超时设置

UART 配置信息说明:

1. aw_serial_dcb:

struct aw_serial_dcb { uint32_t baud_rate; uint32_t byte_size:4; uint32_t f_parity:1; uint32_t parity:1; uint32_t stop_bits:2; uint32_t f_ctsflow:1; uint32_t f_rtsctrl:2; uint32_t f_dsrsensitivity:1; uint32_t f_dsrflow:1; uint32_t f_dtrctrl:2; uint32_t f_outx:1; uint32_t f_inx:1; uint32_t f_fast_respond_recv:1; uint32_t f_dummy:14; uint16_t xon_lim; uint16_t xoff_lim; char xon_char; char xoff_char;};

成员详解:

baud_rate:波特率;

byte_size:数据位宽度,范围:[5:8];

f_parity:奇偶校验,1:使能0:禁能;

parity:校验方法;

表3 串口校验方法取值表

宏定义

含义

AW_SERIAL_EVENPARITY

偶效验

AW_SERIAL_ODDPARITY

奇效验

  • stop_bits:停止位数;

表4 串口停止位数取值表

宏定义

含义

AW_SERIAL_ONESTOPBIT

1 位停止位

AW_SERIAL_ONE5STOPTS

1.5 位停止位

AW_SERIAL_TWOSTOPBITS

2 位停止位

AW_SERIAL_STOP_INVALID

0 表示无效停止位

  • f_ctsflow:监控CTS(clear-to-send)信号作输出流控,1:CTS无效时数据发送被挂起,0:禁能;
  • f_rtsctrl:设置RTS(request-to-send)流控;

表5 串口设备RTS(request-to-send)流控取值表

宏定义

含义

AW_SERIAL_RTS_HANDSHAKE

硬件流控

AW_SERIAL_RTS_DISABLE

软件控制RTS无效

AW_SERIAL_RTS_ENABLE

软件控制RTS有效

AW_SERIAL_RTS_INVALID

无效RTS

  • f_dsrsensitivity:设置dsr_sensitivity,1:对DSR信号敏感,除非DSR信号有效,否则将忽略所有接收的字节;
  • f_dsrflow:是否监控DSR(data-set-ready信号来做输出流控),1:若DSR无效时数据发送被挂起,直至DSR有效;
  • f_dtrctrl:设置DTR(data-termial-ready)流控;

表6 串口设备DTR(data-terminal-ready)流控取值表

宏定义

含义

AW_SERIAL_DTR_HANDSHAKE

硬件流控

AW_SERIAL_DTR_DISABLE

软件控制DTR无效

AW_SERIAL_DTR_ENABLE

软件控制DTR有效

AW_SERIAL_DTR_INVALID

无效DTR

  • f_outx:XON/XOFF流量控制在发送时是否可用。1:当xoff值被收到时,发送停止;当xon值被收到时,发送继续;
  • f_inx:XON/XOFF流量控制在接收时是否可用。1:当接收缓冲区中空余容量小于xoff_lim字节时,发送xoff字符;当接收缓冲区中已有xon_lim字节的空余容量时,发送xon字符,占1位;
  • f_fast_respond_recv:快速响应接收 1:使能0:禁能;

注解:

1.该配置项适用于接收时间敏感型应用,例如modbus;

2.该配置项实现通用的手段是将串口接收FIFO设置为1,当接收到一个数据后就产生接收中断。对于没有FIFO的串口来说,这个设置也许会被忽略。

f_dummy:保留位;

  • xon_lim:在XON字符发送前接收缓冲区内空余容量的最小字节数;
  • xoff_lim:在XOFF字符发送前接收缓冲区内空余容量的最大字节数;
  • xon_char:指定XON字符;
  • xoff_char:指定XOFF字符。

2. aw_serial_timeout:

struct aw_serial_timeout { uint32_t rd_timeout; uint32_t rd_interval_timeout;}

成员详解:

rd_timeout:读超时时间;

rd_interval_timeout:码间超时。

30a5e056-8c2c-11ed-bcbd-dac502259ad0.jpg  使用样例

AWorksLP SDK相关使用请参考《AWorksLP SDK快速入门(MR6450)——开箱体验》一文,本文不在赘述。

‍1. UART0收发功能

{SDK}\demos\peripheral\ serial路径下为通用UART例程,例程具体代码如下:

#include "aworks.h"#include "aw_task.h"#include "aw_delay.h"#include "aw_serial.h"#include "aw_ioctl.h"#include "aw_fcntl.h"#include "aw_application_autoconf.h"#include "aw_unistd.h"#include "aw_vdebug.h"#include "rtk_autoconf.h"/** * \brief 串口 demo * \return 无 */aw_local void* __task_handle (void *parg){ char buf[32]; int len = 0; struct aw_serial_dcb dcb; aw_err_t ret; struct aw_serial_timeout timeout; int fd;
fd = aw_open(CONFIG_DEMO_SERIAL_DEVICE_NAME,AW_O_RDWR,0); if(fd < 0){ aw_kprintf("serial open failed\r\n"); aw_close(fd); return 0; }
/* 获取dcb的默认配置 */ ret = aw_serial_dcb_get(fd, &dcb); if (AW_OK != ret) { aw_kprintf("serial get dcb failed: %d \r\n",ret); aw_close(fd); return 0; }
/* 配置串口波特率为115200,8个数据位,1位停止位,无奇偶校验 */ dcb.baud_rate = 115200; dcb.byte_size = 8; dcb.stop_bits = AW_SERIAL_ONESTOPBIT; dcb.f_parity = AW_FALSE; ret = aw_serial_dcb_set(fd, &dcb); if (AW_OK != ret) { aw_kprintf("serial set dcb failed: %d \r\n",ret); aw_close(fd); return 0; }
/* 配置串口超时 */ ret = aw_serial_timeout_get(fd, &timeout); if (AW_OK != ret) { aw_kprintf("serial get timeout failed: %d \r\n",ret); aw_close(fd); return 0; }
timeout.rd_timeout = 1000; /* 读总超时为1s */ timeout.rd_interval_timeout = 50; /* 码间超时为50ms */ ret = aw_serial_timeout_set(fd, &timeout); if (AW_OK != ret) { aw_kprintf("serial set dcb failed: %d \r\n",ret); aw_close(fd); return 0; }
/* 收到什么数据就发送什么数据 */ AW_FOREVER { /* 读取数据 */ memset(buf, 0, sizeof(buf)); len = aw_read(fd, buf, sizeof(buf)); if (len > 0) { aw_write(fd, buf, len); aw_kprintf("%s\r\n",buf); } }
aw_close(fd); return 0;}

AW_TASK_DECL(serial_tsk, 4096);/******************************************************************************/void demo_serial_int_entry (void){ aw_task_id_t tsk;
tsk = AW_TASK_INIT( serial_tsk, "Serial int demo", 12, 4096, __task_handle, (void *)NULL); if (tsk == NULL) { aw_kprintf("Serial int demo task create failed\r\n"); return; }
if (aw_task_startup(tsk) != AW_OK) { AW_TASK_TERMINATE(serial_tsk); }}

例程默认使用/dev/uart0对应开发板DUART丝印串口,其引脚位置如图1所示:

30c1044e-8c2c-11ed-bcbd-dac502259ad0.png

图1UART0排针

上述代码中创建了一个任务,在任务中实现UART收发功能。使用aw_serial_dcb_get接口获取串口当前的配置信息,修改波特率为115200,8个数据位,1位停止位,无奇偶校验。使用aw_serial_dcb_set接口设置串口。使用aw_serial_timeout_get获取串口时间相关配置信息,修改读总超时为1s,码间超时为50ms,使用aw_serial_timeout_set设置串口。

在AW_FOREVER 循环中使用aw_read接口读取接收到的串口数据,若读取到数据则使用aw_write接口把读取到数据通过该串口发送回去,以此来实现回显功能。

但由于/dev/uart0默认为shell所使用的串口,在shell组件中已开启回显,故此时实验现象如图2所示,会将接收到的数据输出两次,若需实现单次回显,可修改shell组件所引用串口,或修改例程使用的UART设备,具体操作参考下节内容。

30e76382-8c2c-11ed-bcbd-dac502259ad0.jpg

图2串口打印结果

2. UART5收发功能

串口例程中默认使用的是/dev/uart0,为与例程现象描述一致,故将其修改为/dev/uart5。在开发板丝印URX1与UTX1对应设备/dev/uart5,URX2与UTX2对应设备为/dev/uart10,如图3、图4、图5所示。

310caa84-8c2c-11ed-bcbd-dac502259ad0.png

图3排针处串口

3141be18-8c2c-11ed-bcbd-dac502259ad0.png

图4排针原理图

3166de64-8c2c-11ed-bcbd-dac502259ad0.png

图5UART1对应UART5

2.1 打开config 配置脚本,选择例程使用串口为/dev/uart5, 如图6所示,保存后重新build 工程。

3193afca-8c2c-11ed-bcbd-dac502259ad0.png

图6UART1对应UART5

2.2 将USB 转串口接到开发板排针丝印UTX1与URX1 的位置,重新编译下载运行固件,会发现发送数据后不会再重复回复两条相同的数据如图7所示。

31b97282-8c2c-11ed-bcbd-dac502259ad0.jpg

图7串口打印信息

至此,UART设备的收发功能介绍完毕,更多外设的使用介绍请关注后续推文。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 通信
    +关注

    关注

    18

    文章

    5706

    浏览量

    134407
  • uart
    +关注

    关注

    22

    文章

    1159

    浏览量

    99973
收藏 人收藏

    评论

    相关推荐

    AI时代下的场效应管功能运用与产品应用

    AI时代下的场效应管功能运用与产品应用
    的头像 发表于 03-25 15:07 167次阅读
    AI时代下的场效应管功能运用与<b class='flag-5'>产品应用</b>

    AMAZINGIC晶焱科技:面板产品应用的EOS最佳解決方案

    AMAZINGIC晶焱科技:面板产品应用的EOS最佳解決方案
    的头像 发表于 01-24 10:16 234次阅读

    AWorksLP应用笔记:重定向printf函数

    printf函数作为标准库定义的格式化输出方式,本文将介绍其在AWorksLP下默认适配以及重映射至热拔插设备端口的实现。默认适配AWorksLP中默认已经对printf函数完成相关适配工作,且默认
    的头像 发表于 11-25 08:24 253次阅读
    <b class='flag-5'>AWorksLP</b>应用笔记:重定向printf函数

    AWorksLP 样例详解MR6750)——双核通信

    AWorksLP对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以MR6750平台为例,介绍AWorksLP双核通信的基本用法。简介通信信箱MBX有2套寄存器访问
    的头像 发表于 09-27 08:26 375次阅读
    <b class='flag-5'>AWorksLP</b> 样例<b class='flag-5'>详解</b>(<b class='flag-5'>MR</b>6750)——双核通信

    AWorksLP 样例详解MR6750)——双核调试

    AWorksLP对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以MR6750平台为例,介绍AWorksLP双核调试的基本用法。简介MR6750双核是
    的头像 发表于 09-23 08:26 330次阅读
    <b class='flag-5'>AWorksLP</b> 样例<b class='flag-5'>详解</b>(<b class='flag-5'>MR</b>6750)——双核调试

    AWorksLP 样例详解MR6750)——双核烧录

    AWorksLP对外设进行了高度抽象化,为同一类外设提供了相同的接口,应用程序可以轻松跨平台。本文以MR6750平台为例,介绍AWorksLP双核烧录的方法。简介MR6750双核是集成
    的头像 发表于 09-21 08:26 339次阅读
    <b class='flag-5'>AWorksLP</b> 样例<b class='flag-5'>详解</b>(<b class='flag-5'>MR</b>6750)——双核烧录

    国产操作系统AWorks LP — 科技自立自强的排头兵

    ZLG致远电子一直在科技仪器设备、操作系统国产化道路深耕多年,推出的新一代国产化工业物联网解决方案:AWorksLP操作系统搭配国产MR6450核心板,助力用户快速开发出具有市场竞争力的产品。ZLG
    的头像 发表于 08-03 08:28 325次阅读
    国产操作系统AWorks LP — 科技自立自强的排头兵

    【技术分享】国产操作系统AWorks LP — 科技自立自强的排头兵

    ZLG致远电子一直在科技仪器设备、操作系统国产化道路深耕多年,推出的新一代国产化工业物联网解决方案:AWorks LP操作系统搭配国产MR6450核心板,助力用户快速开发出具有市场竞争力的产品
    的头像 发表于 08-02 11:45 308次阅读
    【技术分享】国产操作系统AWorks LP — 科技自立自强的排头兵

    EPC6450-AWI工控板搭载MR6450核心板,强势来袭!

    EPC6450-AWI基于完全国产自主研发的MR6450核心板进行开发,接口丰富,性能强劲,本文将为您详细介绍该工控单板。 EPC6450-AWI工控单板是基于MR6450核心板进行开
    的头像 发表于 07-12 11:45 266次阅读
    EPC<b class='flag-5'>6450</b>-AWI工控板搭载<b class='flag-5'>MR6450</b>核心板,强势来袭!

    产品应用】MX2000上如何拓展CAN接口?

    上不具备CAN接口,但可通过我司CSM300(A)系列SPI(UART)转CAN模块进行拓展CAN接口。在实际产品应用场景中如果需要使用CAN接口,则可以参考本文进行
    的头像 发表于 06-22 10:02 389次阅读
    【<b class='flag-5'>产品应用</b>】MX2000上如何拓展CAN接口?

    产品应用】MX2000上如何拓展CAN接口?

    MX2000平台上不具备CAN接口,但可通过我司CSM300(A)系列SPI(UART)转CAN模块进行拓展CAN接口。 在实际产品应用场景中如果需要使用CAN接口,则可以参考本文进行拓展、测试、评估
    的头像 发表于 06-21 11:40 331次阅读
    【<b class='flag-5'>产品应用</b>】MX2000上如何拓展CAN接口?

    致远电子2023年文章月度回顾 | 2023.05期

    给设备? ꔷ  AWorksLP例程介绍(MR6450)— SD卡 ꔷ  基于CAN智慧云实现远程ECU升级 ꔷ  基
    的头像 发表于 06-08 17:00 251次阅读

    HPM6750和HPM6450是PIN to PIN的吗?

    相同的封装,HPM6750和HPM6450是PINto PIN的吗?
    发表于 06-08 08:27

    产品应用AWorksLP例程介绍(MR6450)—— SD卡

    AWorksLP对存储类设备进行了高度抽象化,为存储类设备提供了通用的文件操作接口,应用程序可以轻松跨平台。本文以MR6450平台为例,介绍AWorksLP基于FatFs的SD卡的基本用法。简介SD
    的头像 发表于 05-10 09:42 370次阅读
    【<b class='flag-5'>产品应用</b>】<b class='flag-5'>AWorksLP</b>例程介绍(<b class='flag-5'>MR6450</b>)—— SD卡

    介绍AWorksLP基于FatFs的SD卡的基本用法

    AWorksLP对存储类设备进行了高度抽象化,为存储类设备提供了通用的文件操作接口,应用程序可以轻松跨平台。
    的头像 发表于 05-08 16:23 535次阅读
    介绍<b class='flag-5'>AWorksLP</b>基于FatFs的SD卡的基本用法