【MAX7800与ESP8266mcu通讯】

简介: 【MAX7800与ESP8266mcu通讯】

1. 前言

前期搭好MAX7800 的eclipse和ESP82666的Arduino开发环境,现在开始慢慢实现这两者的通讯,目前MAX7800 羽毛板可以发送字符串,但是ESP8266无法连续接收,因此采用简单的单个字符的串口通讯实现点灯功能



1.png

2.png



不要问我D0为什么不行,波特率在9600以下都可以,因为它本身不适合🤣🤣🤣


2. 实验条件

2.1 硬件条件

本次采用ESP8266node MCU开发板和MAX7800羽毛板,利用ESP8266软串口通讯与MAX7800 UART2硬串口搭建单字符通讯,采用关键字符实现开关灯功能


名称 端口
LED +接D2,-接GND
ESP8266 P1_1接D3,P1_0接D1,GND接GND,mcro数据线
MAX7800 P1_1接D3,P1_0接D1,GND接GND,mcro数据线

image.png



2.2 软件条件

ESP8266-NodeMCU物联网开发之Arduino环境搭建

【window下配置Maxim SDK环境】


3. 程序编写

3.1 ESP8266程序解剖

三个子程序


  1. 读取软硬串口字符
  2. 打印两次不同的字符
  3. 测试ok字符

主程序


  1. 读取软硬串口
  2. 判别是否为ok
  3. 是则灯亮,进而判别是否为stop,退出


5.png

源代码


#include <SoftwareSerial.h>
volatile int item;
volatile int item1;
SoftwareSerial mySerial(0,5);
void procedure() {
  if (item != item1) {
    Serial.print("item:  ");
    Serial.println(item);
    item1 = item;
  }
}
void procedure2() {
  if (Serial.available() > 0) {
    item = Serial.read();
  }
  if (mySerial.available() > 0) {
    item = mySerial.read();
  }
}
void procedure3() {
  Serial.println("ok");
}
void setup(){
  item = 0;
  item1 = 0;
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(4, OUTPUT);
  digitalWrite(4,LOW);
  Serial.println(item);
  mySerial.println(item);
}
void loop(){
  delay(100);
  procedure2();
  procedure();
  while (item == '1') {
    procedure3();
    delay(100);
    digitalWrite(4,HIGH);
    procedure2();
    procedure();
    if (item == '0') {
      digitalWrite(4,LOW);
      break;
    }
  }
}


3.2 MAX7800程序解剖

采用uart实例教程改写而成

按照1:4时间比例发送0和1,对此esp8266按照此间隔刷新LED灯亮灭


******************************************************************************/
/**
 * @file    main.c
 * @brief   UART!
 * @details This example demonstrates the UART Loopback Test.
 */
/***** Includes *****/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "mxc_device.h"
#include "led.h"
#include "board.h"
#include "mxc_delay.h"
#include "uart.h"
#include "dma.h"
#include "nvic_table.h"
#include "mxc_delay.h"
/***** Definitions *****/
#define DMA
#define UART_BAUD 9600
//#define UART_BAUD 115200
#define BUFF_SIZE 1024
#define BUFF1_SIZE 12
/***** Globals *****/
volatile int READ_FLAG;
volatile int DMA_FLAG;
#if defined(BOARD_EVKIT_V1)
#define READING_UART 1
#define WRITING_UART 2
#elif defined(BOARD_FTHR_REVA)
//#define READING_UART 2
#define READING_UART 2
#define WRITING_UART 2
#else
#warning "This example has been written for the MAX78000 Ev Kit or FTHR board."
#endif
/***** Functions *****/
#ifdef DMA
void DMA_Handler(void)
{
    MXC_DMA_Handler();
    DMA_FLAG = 0;
}
#else
void UART_Handler(void)
{
    MXC_UART_AsyncHandler(MXC_UART_GET_UART(READING_UART));
}
#endif
void readCallback(mxc_uart_req_t *req, int error)
{
    READ_FLAG = error;
}
void writemsg(uint8_t *TxData,int BUFF)
{
    mxc_uart_req_t write_req;
    write_req.uart = MXC_UART_GET_UART(WRITING_UART);
    write_req.txData = TxData;
    write_req.txLen = BUFF;
    write_req.rxLen = 0;
    write_req.callback = NULL;
    MXC_UART_Transaction(&write_req);
    MXC_Delay(100000);
}
/******************************************************************************/
int main(void)
{
    int error,  fail = 0;
//    uint8_t TestTxData[BUFF1_SIZE];
    uint8_t RxData[BUFF_SIZE];
    printf("\n\n**************** UART Example ******************\n");
    printf("This example sends data from one UART to another.\n");
    printf("\nConnect the TX pin of UART%d to the RX pin of UART%d for this example.\n",
           WRITING_UART, READING_UART);
    printf("\n-->UART Baud \t: %d Hz\n", UART_BAUD);
    printf("\n-->Test Length \t: %d bytes\n", BUFF_SIZE);
    memset(RxData, 0x0, BUFF_SIZE);
#ifdef DMA
    MXC_DMA_Init();
    MXC_DMA_ReleaseChannel(0);
    MXC_NVIC_SetVector(DMA0_IRQn, DMA_Handler);
    NVIC_EnableIRQ(DMA0_IRQn);
#else
    NVIC_ClearPendingIRQ(MXC_UART_GET_IRQ(READING_UART));
    NVIC_DisableIRQ(MXC_UART_GET_IRQ(READING_UART));
    MXC_NVIC_SetVector(MXC_UART_GET_IRQ(READING_UART), UART_Handler);
    NVIC_EnableIRQ(MXC_UART_GET_IRQ(READING_UART));
#endif
    // Initialize the UART
    if ((error = MXC_UART_Init(MXC_UART_GET_UART(READING_UART), UART_BAUD, MXC_UART_APB_CLK)) !=
        E_NO_ERROR) {
        printf("-->Error initializing UART: %d\n", error);
        printf("-->Example Failed\n");
        while (1) {}
    }
    if ((error = MXC_UART_Init(MXC_UART_GET_UART(WRITING_UART), UART_BAUD, MXC_UART_APB_CLK)) !=
        E_NO_ERROR) {
        printf("-->Error initializing UART: %d\n", error);
        printf("-->Example Failed\n");
        while (1) {}
    }
    printf("-->UART Initialized\n\n");
    READ_FLAG = 1;
    DMA_FLAG = 1;
    uint8_t *firstName = "0\n";
    uint8_t *lastName = "1\n";
    if (fail == 0) {
  LED_On(LED1);
  printf("\n-->EXAMPLE SUCCEEDED\n");
  int count=0;
  while(1){
    printf("count : %d\n", count++);
//    sprintf(TestTxData, "%s%d\n", firstName, count);
//    writemsg( TestTxData, BUFF1_SIZE);
    MXC_Delay(200000);
    if(count%5==0){
    writemsg( lastName, 1);
    }
    else
    writemsg( firstName, 1);
    MXC_Delay(500000);
  }
    }
    return fail;
}


下面给出max7800输出字符串代码,无法与esp8266通讯,暂时没有找到原因🤣🤣🤣




/**
 * @file    main.c
 * @brief   UART!
 * @details This example demonstrates the UART Loopback Test.
 */
/***** Includes *****/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "mxc_device.h"
#include "led.h"
#include "board.h"
#include "mxc_delay.h"
#include "uart.h"
#include "dma.h"
#include "nvic_table.h"
#include "mxc_delay.h"
/***** Definitions *****/
#define DMA
#define UART_BAUD 9600
//#define UART_BAUD 115200
#define BUFF_SIZE 1024
#define BUFF1_SIZE 12
/***** Globals *****/
volatile int READ_FLAG;
volatile int DMA_FLAG;
#if defined(BOARD_EVKIT_V1)
#define READING_UART 1
#define WRITING_UART 2
#elif defined(BOARD_FTHR_REVA)
//#define READING_UART 2
#define READING_UART 2
#define WRITING_UART 2
#else
#warning "This example has been written for the MAX78000 Ev Kit or FTHR board."
#endif
/***** Functions *****/
#ifdef DMA
void DMA_Handler(void)
{
    MXC_DMA_Handler();
    DMA_FLAG = 0;
}
#else
void UART_Handler(void)
{
    MXC_UART_AsyncHandler(MXC_UART_GET_UART(READING_UART));
}
#endif
void readCallback(mxc_uart_req_t *req, int error)
{
    READ_FLAG = error;
}
void writemsg(uint8_t *TxData,int BUFF)
{
    mxc_uart_req_t write_req;
    write_req.uart = MXC_UART_GET_UART(WRITING_UART);
    write_req.txData = TxData;
    write_req.txLen = BUFF;
    write_req.rxLen = 0;
    write_req.callback = NULL;
    MXC_UART_Transaction(&write_req);
}
/******************************************************************************/
int main(void)
{
    int error,  fail = 0;
    uint8_t TestTxData[BUFF1_SIZE];
    uint8_t RxData[BUFF_SIZE];
    printf("\n\n**************** UART Example ******************\n");
    printf("This example sends data from one UART to another.\n");
    printf("\nConnect the TX pin of UART%d to the RX pin of UART%d for this example.\n",
           WRITING_UART, READING_UART);
    printf("\n-->UART Baud \t: %d Hz\n", UART_BAUD);
    printf("\n-->Test Length \t: %d bytes\n", BUFF_SIZE);
    memset(RxData, 0x0, BUFF_SIZE);
#ifdef DMA
    MXC_DMA_Init();
    MXC_DMA_ReleaseChannel(0);
    MXC_NVIC_SetVector(DMA0_IRQn, DMA_Handler);
    NVIC_EnableIRQ(DMA0_IRQn);
#else
    NVIC_ClearPendingIRQ(MXC_UART_GET_IRQ(READING_UART));
    NVIC_DisableIRQ(MXC_UART_GET_IRQ(READING_UART));
    MXC_NVIC_SetVector(MXC_UART_GET_IRQ(READING_UART), UART_Handler);
    NVIC_EnableIRQ(MXC_UART_GET_IRQ(READING_UART));
#endif
    // Initialize the UART
    if ((error = MXC_UART_Init(MXC_UART_GET_UART(READING_UART), UART_BAUD, MXC_UART_APB_CLK)) !=
        E_NO_ERROR) {
        printf("-->Error initializing UART: %d\n", error);
        printf("-->Example Failed\n");
        while (1) {}
    }
    if ((error = MXC_UART_Init(MXC_UART_GET_UART(WRITING_UART), UART_BAUD, MXC_UART_APB_CLK)) !=
        E_NO_ERROR) {
        printf("-->Error initializing UART: %d\n", error);
        printf("-->Example Failed\n");
        while (1) {}
    }
    printf("-->UART Initialized\n\n");
    READ_FLAG = 1;
    DMA_FLAG = 1;
    char *firstName = "count: ";
    if (fail == 0) {
        LED_On(LED1);
        printf("\n-->EXAMPLE SUCCEEDED\n");
        int count=0;
        while(1){
            printf("count : %d\n", count++);
            sprintf(TestTxData, "%s%d\n", firstName, count);
            writemsg( TestTxData, BUFF1_SIZE);
            MXC_Delay(500000);
        }
    }
    return fail;
}


4. 实验效果

4.1 esp8266打印如下


6.png



已打开串口: COM12
0
item:  49
ok
ok
ok
ok
ok
ok
ok
ok
item:  48
item:  49
1
2
3
4
5
6
7
8
9
10
11
12
13
4.2 max7800打印如下
19:28:30.829 -> 
19:28:30.829 -> 
19:28:30.832 -> **************** UART Example ******************
19:28:30.834 -> This example sends data from one UART to another.
19:28:30.838 -> 
19:28:30.838 -> Connect the TX pin of UART2 to the RX pin of UART2 for this example.
19:28:30.844 -> 
19:28:30.844 -> -->UART Baud  : 9600 Hz
19:28:30.846 -> 
19:28:30.846 -> 
19:28:30.846 -> -->Test Length  : 1024 bytes
19:28:30.848 -> -->UART Initialized
19:28:30.850 -> 
19:28:30.850 -> 
19:28:30.850 -> -->EXAMPLE SUCCEEDED
19:28:30.853 -> count : 0
19:28:31.651 -> count : 1
19:28:32.448 -> count : 2
19:28:33.245 -> count : 3
19:28:34.042 -> count : 4
19:28:34.839 -> count : 5

7.png

5. 小结

通过对这篇文章我们掌握了MAX7800与ESP8266mcu串口通讯点灯,接下来会有许多有趣的实验,尝试与Arduino通讯做语音小车,进而丰富我们的生活。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣

目录
相关文章
|
8月前
|
网络协议 数据处理 数据格式
51单片机ESP8266云端通信的实现
51单片机ESP8266云端通信的实现
463 1
|
芯片
STM32使用HAL库实现RS485通讯(全双工串口)
STM32使用HAL库实现RS485通讯(全双工串口)
1195 0
|
7月前
|
传感器 IDE 开发工具
使用两块ESP8266实现ESP-NOW通信
ESP-NOW是一个强大的协议,可以在没有Wi-Fi网络的情况下实现设备间的快速通信。通过以上步骤,你可以使用两块ESP8266开发板建立一个简单的ESP-NOW通信系统。这种方式特别适用于低功耗、低延迟和无需网络基础设施的应用场景。希望这篇博客能帮你快速入门ESP-NOW,开启你的无线通信开发之旅。
654 4
|
7月前
|
网络协议
了解AT指令以及STM32F103如何通过ESP8266连接到WiFi
AT指令是一组用于控制调制解调器的命令,最早由Hayes公司为其智能调制解调器开发。如今,AT指令已被广泛应用于各种通信模块中,包括GSM、Bluetooth和WiFi模块。AT指令通常以“AT”开头,后跟特定的命令和参数。通过这些指令,我们可以执行一系列操作,如设置网络参数、发送数据和查询状态等。
311 0
|
8月前
|
存储 传感器 人工智能
ESP32 使用RS485模块实现Modbus通信
ESP32 使用RS485模块实现Modbus通信
459 0
|
并行计算 监控 网络协议
西门子PLC常用的通讯接口和通讯协议有哪些?RS232、RS485、PPI、MPI、Modbus、Profibus、Uss的特点
西门子PLC常用的通讯接口和通讯协议有哪些?RS232、RS485、PPI、MPI、Modbus、Profibus、Uss的特点
西门子PLC常用的通讯接口和通讯协议有哪些?RS232、RS485、PPI、MPI、Modbus、Profibus、Uss的特点
|
传感器 存储 芯片
STM32F407硬件I2C实现MPU6050通讯(CUBEIDE)
STM32F407硬件I2C实现MPU6050通讯(CUBEIDE)
360 0
|
智能硬件
STM32智能家居(4)ESP8266连接WIFI
STM32智能家居(4)ESP8266连接WIFI
727 0
STM32使用HAL库实现modbus的简单通讯
STM32使用HAL库实现modbus的简单通讯
340 0