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)
}
符合你的所需的要求吧。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)