ESP32使用ARDUINO 对RS485 的DE/RE#控制
概述
原来一直用74HC04配合SP3485做RS485输出模块,对SP3485模块的DE/RE#端不控制。线路图如下: 但这次因为线路板尺寸紧张,并且有多余的点可以控制DE/RE#, 就选择了如下的线路: 现在来说一下编程遇到的困惑和解决问题的思路。
编程方法
方法一
当要向外部输出数据数据时,采用delay(10) 的方式,才能让串口的数据输出到外部接口。
比如我使用了RX2,TX2作为RS485的输出模块。程序应该这样,不然不能输出数据。
if ( Serial.available())
{
uint8_t x = Serial.read();
if ( x == 's' )
{
char sendBuff[] = "Send message to RS485";
digitalWrite(DE_485, HIGH);
Serial2.println(sendBuff);
delay(10);
digitalWrite(DE_485, LOW);
Serial.println("Message sneded to RS485");
}
}
程序说明:如果在digitalWrite(DE_485, HIGH)后不延时10ms的话无法在串口2上输出信息。在程序中添加这个delay(10)后可以正常输出了。还没有试,大量的数据可能要延长这个延时时间。
方法二
采用中断的方式。 中断程序:
void IRAM_ATTR isrDown()
{
digitalWrite(DE_485, HIGH);
}
void IRAM_ATTR isrRDown()
{
digitalWrite(DE_485, LOW);
}
在setup中将中断程序分配给特定的端子:
attachInterrupt(17, isrDown, FALLING);
attachInterrupt(16, isrRDown, RISING);
17是TX2,16是RX2,分别是串口2对应的TX和RX。这时,程序就像RS232或USB普通串口一样发送和接收就可以了。
if ( Serial.available())
{
uint8_t x = Serial.read();
if ( x == 's' )
{
char sendBuff[] = "Send message to RS485";
Serial2.println(sendBuff);
Serial.println("Message sneded to RS485");
}
}
总结
从程序可以看出,Arduino还是有操作系统的特点,在代码上看Serial2.println(sendBuff)在后台是运行的,当我们发送这个指令时,后台按波特率不断的执行,这条语句后面如果直接执行digitalWrite(DE_485, LOW), 会使数据发送不出去。采用中断形式是一种尝试。或许在频繁操作的RS485时会不会健康运行有待于验证,也希望网友提宝贵意见。
|