MicroPython+ESP8266:UART串口通信

MicroPython+ESP8266:UART串口通信,第1张

软件准备:

NodeMCU v2提供三个UART。您可以在TXD0,RXD0,TXD1,TXD2,RXD2上看到它们:

我们可以使用UART库访问UART串口

在本章中,我使用Arduino板作为UART源。我们从UART读取传入的消息。开始吧!

在串口通信的教程中,我使用Arduino Uno连接到NodeMCU板。我们在连接到Arduino板的NodeMCU上使用UART0。我们应该将RX引脚连接到TX引脚,将TX引脚连接到RX引脚。

以下是我们的连线方式:

我的接线实现如下图所示:

首先,我们使用Arduino IDE为Arduino UNO编写程序。我们使用SoftwareSerial模拟软串口10和11.该程序将等待输入的UART数据,然后在0和1引脚上发送到Arduino UART。接下来开始写这个程序:

Arduino程序:

保存这个程序。然后,将其上传到Arduino板。在上传之前,请确保Arduino UART(数字0,1,10和11引脚)不能连接到任何电路或传感器。下一步是为NodeMCU板编写程序。创建一个名为uartdemo.py的文件。开始编写程序:

Nodemcu程序:

现在您可以通过WebREPL上传和运行MicroPython程序。完成后,将NodeMCU UART连接到Arduino UART(数字引脚:10和11)。要查看UART输出,请从Arduino IDE打开串行监视器工具。设置波特9600.您应该看到UART输出:

以下是WebREPL上的程序输出:

/*******************************************************************************

*File: main.c

*功能:使用串口UART0接收上位机发送的数据,当接收到8个连续数据后,取反LED控制,并将

* 数据原封不动地发送回上位机

*******************************************************************************/

#include"config.h"

#define LED1CON0x00000400 /*LED(DS11)控制,低电平点亮,用于通信指示*/

/*定义Fpclk值,用于设置串口波特率*/

#defineFPCLK 2764800L

/*定义串口模式设置数据结构*/

typedef struct UartMode

{ uint8 datab //字长度,5/6/7/8

uint8 stopb //停止位,1/2

uint8 parity //奇偶校验位,0为无校验,1为奇数校验,2位偶数校验

} UARTMODE

uint8 rcv_buf[8] //UART0数据接收缓冲区

uint8 rcv_new //接收新数据标志

/*******************************************************************************

*名称: IRQ_UART0(void)

*功能: 串口UART0接收中断

*******************************************************************************/

void __irq IRQ_UART0(void)

{ uint32 i

i=IOSET //读取当前LED控制值

if((i&LED1CON)==0) //控制LED输出

{ IOSET=LED1CON

}

else

{ IOCLR=LED1CON

}

if(0x04==(U0IIR&0x0F))rcv_new=1 //设置接收到新的数据标志

for(i=0i<7i++)

{ rcv_buf[i]=U0RBR//读取FIFO的数据,并清除中断标志

}

VICVectAddr=0x00 //中断处理结束

}

/*******************************************************************************

*名称: SendByte()

*功能: 向串口发送字节数据

*入口参数:data 要发送的数据

*******************************************************************************/

void SendByte(uint8 data)

{ U0THR=data

while((U0LSR&0x20)==0) //等待数据发送

}

/*******************************************************************************

*名称: ISendBuf()

*功能: 将缓冲区的数据发送回主机,并等待发送完毕

*******************************************************************************/

void ISendBuf(void)

{ uint8 i

for(i=0i<7i++)SendByte(rcv_buf[i])

while((U0LSR&0x20)==0) //等待数据发送

}

/*******************************************************************************

*名称: UART0_Ini()

*功能: 初始化串口0. 设置其工作模式及波特率

*入口参数: baud 波特率

set 模式设置 (UARTMODE数据结构)

*出口参数:返回值为1时表示初始化成功,为0表示参数出错

*******************************************************************************/

uint8 UART0_Ini(uint32 baud,UARTMODE set)

{ uint32 bak

/*参数过滤*/

if((0==baud)||(baud>115200))return(0)

if((set.datab<5)||(set.datab>8))return(0)

if((0==set.stopb)||(set.stopb>2))return(0)

if(set.parity>4)return(0)

/*设置串口波特率*/

U0LCR=0x80//DLAB位置1

bak=(FPCLK>>4)/baud

U0DLM=bak>>8

U0DLL=bak&0xff

/*设置串口模式*/

bak=set.datab-5 //设置字长度

if(2==set.stopb)bak|=0x04 //判断是否为2位停止位

if(0!=set.parity){set.parity=set.parity-1bak|=0x08}

bak|=set.parity<<4//设置奇偶校验

U0LCR=bak

return(1)

}

/*******************************************************************************

*名称: main()

*功能: 初始化串口,并等待接收到串口数据

*******************************************************************************/

int main(void)

{ UARTMODE uart0_set

PINSEL0=0x00000005 //设置I/O连接到UART0

PINSEL1=0x00000000

IODIR=LED1CON //设置LED控制口为输出,其它I/O为输入

rcv_new=0

uart0_set.datab=8 //8位数据位

uart0_set.stopb=1 //1位停止位

uart0_set.parity=0 //无奇偶校验位

UART0_Ini(9600,uart0_set) //初始化串口模式,波特率9600

U0FCR=0x81 //使能FIFO,并设置触发点为8字节

U0IER=0x01//允许RBR中断,即接收中断

/*设置中断允许*/

VICIntSelect=0x00000000//设置所有通道为IRQ中断

VICVectCntl0=0x26 //UART0中断通道分配到IRQ Slot0,即优先级最高

VICVectAddr0=(int)IRQ_UART0//设置UART0向量地址

VICIntEnable=0x00000040//使能UART0中断

while(1) //等待中断

{

if(1==rcv_new)

{

ISendBuf() //将接收到的数据发送回主机

rcv_new=0

}

}

return(0)

}

符合你的所需的要求吧。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11672875.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存