目录
介绍
UART(通用异步接收器/发送器)是一种串行通信协议,其中数据一次一位地串行传输。异步串行通信广泛用于面向字节的传输。在异步串行通信中,一次传输一个字节的数据。
UART串行通信协议使用定义的帧结构作为其数据字节。异步通信中的帧结构包括:
- START位:它有点表示串行通信已启动且始终为低电平。
- DATA BYTE位:数据位可以是5到9位的包。通常我们使用8位数据包,它总是在START位之后发送。
- STOP位:通常为一位或两位。它在数据位包之后发送以指示帧结束。停止位始终为逻辑高电平。
通常,异步串行通信帧由START位(1位)后跟DATA BYTE(8位)和STOP位(1位)组成,它形成一个10位帧,如上图所示。帧也可以由2个STOP位而不是单个位组成,并且在STOP位之后还可以有一个PARITY位。
基于NodeMCU的ESP8266有两个UART接口,UART0和UART1。通过UART接口的ESP8266数据传输速度可达到115200的40倍,即4.5 Mbps。默认情况下,40MHz振荡器的UART0波特率为115200。它可以根据应用需要更改为用户定义的值。
NodeMCU UART引脚
NodeMCU UART引脚
TXD(数据传输引脚)
该引脚用于串行传输数据。
RXD(数据接收引脚)
该引脚用于串行接收数据。
注: SD_DATA_1 / RXD1引脚内部用于与闪存的SPI四通信。因此,我们只能使用UART1的TXD1引脚。
基于NodeMCU LUA的UART功能
让我们看一下基于LUA的函数,这些函数可用于NodeMCU中的UART接口。
uart.setup()
该功能配置UART的通信参数。
注意:如果此功能在接收过程中重新配置UART,则通过UART发送的字节将丢失。
句法: uart.setup(id, baud, databits, parity, stopbits[, echo])
参数:
id
: UART id(0或1)。baud
:波特率可以是以下之一:300,600,1200,2400,4800,9600,19200,31250,38400,57600,74880,115200,230400,256000,460800,921600,1843200,3686400。databits
:数字,每帧数据位数。它可以采用以下值之一:5,6,7,8parity
:如果需要,从uart.PARITY_NONE,uart.PARITY_ODD或uart.PARITY_EVEN设置奇偶校验选项stopbits
:设置否。每帧停止位。它可以是以下之一:uart.STOPBITS_1,uart.STOPBITS_2echo
:如果为0,则禁用echo,否则启用echo(如果省略则默认)
返回:配置的波特率。
例:
-- configure for 9600, 8N1, with echo uart.setup(0, 9600, 8, uart.PARITY_NONE, uart.STOPBITS_1, 1)
uart.on()
此函数设置回调函数以处理UART事件。目前仅支持“数据”事件。
注意:由于ESP8266的限制,只有UART 0能够接收数据。
句法: uart.on(method, [number/end_char], [function], [run_input])
参数:
method
: “数据”,数据将在UART上接收number/end_char
: number用于设置要接收的数据字节数。end_char是将用作数据结尾的任何字符。function
:这是回调函数,它根据number / end_char中定义的方式完全接收数据时触发。它有数据作为输入参数来处理。- 例如,功能(数据)打印(“接收数据:”,数据)结束
run_input
: 0或1.如果为0,UART的输入将不会进入Lua解释器。它可以接受二进制数据。如果为1,UART的输入将进入Lua解释器并运行。
要取消注册回调,请仅提供“data”参数。即uart.on(“data”)
返回: null
uart.alt()
该功能用于更改UART引脚分配。
句法: uart.alt(on)
参数:
On
: 0表示标准引脚,即GPIO3和GPIO1,1表示使用备用引脚,即GPIO13和GPIO15。
返回: null
uart.getconfig()
该函数用于返回UART的当前配置参数。
句法: uart.getconfig(id)
参数:
id
: UART id(0或1)。
返回:返回四个值,如下所示:
baud
:以下之一:300,600,1200,2400,4800,9600,19200,38400,57600,74880,115200,230400,256000,460800,921600,1843200,3686400databits
:以下之一:5,6,7,8parity
:以下之一:uart.PARITY_NONE,uart.PARITY_ODD或uart.PARITY_EVENstopbits
:以下之一:uart.STOPBITS_1,uart.STOPBITS_1_5或uart.STOPBITS_2
uart.write()
该函数将字符串或字节写入UART。
句法: uart.write(id, data1 [, data2, ...])
参数:
id
: UART id(0或1)。data1, data2, ...
:通过UART发送的字符串或字节
返回: null
例:
uart.write(0, "Hello, world\n")
例
让我们为两个NodeMCU之间的UART串行通信编写一个Lua脚本。
这里发送器NodeMCU将从UART1发送引脚发送字符串,即TXD1。接收器NodeMCU将接收它并在串行监视器窗口上打印。
NodeMCU Transmitter(发送)的Lua脚本
uart.setup(1, 115200, 8, uart.PARITY_NONE, uart.STOPBITS_1, 1)-- setup UART1 i.e. pin GPIO2 while true do --send string per second continuously uart.write(1, "Hello friend\n") tmr.delay(1000000) end
NodeMCU Receiver(接收)的Lua脚本
下面是接收器端的ESPlorer串行监视器输出窗口。接收器NodeMCU将在ESPlorer输出窗口上打印接收的数据,如下图所示。 输出结果
谢谢,一开始看见只有uart0可以接受数据我是不信的,直到使用uart1打印出cause:4, boot mode:(3,6) 很早就看见这篇文章,现在只感觉不听老人言吃亏在眼前