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
相关产品推荐
相关产品推荐

