You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MKR1400GSM库中MAX485引脚高低电平设置异常排查

MKR1400搭配MAX485的RS485收发异常问题

我之前用LOLIN mini d1通过RS485读取电池BMS,相关库调试后运行正常。现在换成MKR1400,打算通过GSM发送MQTT数据,但遇到了MAX485模块的奇怪问题:MAX485需要把DE和RE引脚置高进入发送模式,置低进入接收模式,这个逻辑我已经写到简化的调试库里了,但出现异常。


头文件代码(SerialTest.h)

#ifndef SERIALTEST_H 
#define SERIALTEST_H

#include "Arduino.h"

class ETDBms {
public:
    ETDBms();  // Constructor

    void begin(Uart &port); 
    void SerialTxControl(uint8_t pinTx);
    void SerialRxControl(uint8_t pinRx);
    void main_task(); 
    void readSerial(); // New member function to read from serial port and write to serial monitor
    
private:
    bool is_initialized;
    Uart* serial; 
    uint8_t _pinTx;
    uint8_t _pinRx;
};

#endif  // SERIALTEST_H 

实现文件代码(SerialTest.cpp)

#include "SerialTest.h"

// Constructor
ETDBms::ETDBms() {
    is_initialized = false;
}

// Start processing
void ETDBms::begin(Uart &port) {
    serial = &port;
    is_initialized = true;
}

// Set the Rx and Tx pins
void ETDBms::SerialTxControl(uint8_t pinTx) {
    _pinTx = pinTx;
}

void ETDBms::SerialRxControl(uint8_t pinRx) {
    _pinRx = pinRx;
}

// Call this as fast as possible within the sketch's loop() function
void ETDBms::main_task() {
    if (is_initialized) {
        // SET the RS485 shield to transmit mode
        digitalWrite(_pinTx, HIGH);
        digitalWrite(_pinRx, HIGH);

        
        serial->print("test"); // Sending "test" over the serial port
        
        // SET the RS485 shield to receive mode
        digitalWrite(_pinTx, LOW);
        digitalWrite(_pinRx, LOW);

        
        delay(2000); // Delay for readability
    }
}

// Read from Serial1 port and write to serial monitor (Serial)
void ETDBms::readSerial() {
    if (serial->available()) {
        Serial.print("Received from Serial1: ");
        while (serial->available()) {
            char c = serial->read();
            Serial.print(c);
        }
        Serial.println();
    }
}

主程序代码

#include "SerialTest.h"

ETDBms bms;

int pinRX = 2;
int pinTX = 3;

void setup() {
  pinMode(pinRX, OUTPUT);
  pinMode(pinTX,OUTPUT);

  Serial.begin(115200);
  Serial1.begin(9600);

  bms.begin(Serial1); //baud rate 9600
  bms.SerialRxControl(pinRX);
  bms.SerialTxControl(pinTX);
}

void loop() {
  bms.main_task();
  //bms.readSerial();

}

异常现象与疑问

  • 注释掉delay(2000)语句后,DE/RE引脚能正常置高并发送数据,但无法接收返回数据
  • 保留delay语句时,DE/RE引脚始终保持低电平,完全无法进入发送模式

我能理解延迟可能影响串口通信,但搞不懂为什么保留delay会导致引脚连高电平都出不来。哪怕把库代码直接搬到主程序里,还是有一样的电平异常;把库中所有延迟都删掉也没用。现在MAX485完全没法正常收发,我觉得只要解决这个电平问题,库就能正常工作。想问下是不是MKR1400有什么特殊特性被我忽略了?


内容的提问来源于stack exchange,提问作者MathCoMath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 06:23:14