关于ESP32—C3和ttl转rs485接收发数据的使用案例(风速与风向变送器)

本文详细介绍了如何在ESP32-C3上通过串口接收和发送Modbus格式的数据,涉及硬件设备配置、串口调试助手的使用、数据解析和发送,以及Modbus协议注意事项,展示了风速风向数据的完整流程。
摘要由CSDN通过智能技术生成

一:实现功能

在esp-c3上实现串口接收发modbus格式的数据,通过风速风向变送器,测量风速风向变送器。

二:使用器材

1.一个ESP32—c3

2.一个ttl转rs485接口

3.一个RS-FS-N01风速变送器,一个RS-FX-N01风向变送器

三:实验过程

1.配置波特率,字节数以及rx,tx引脚

#include <Arduino.h>
#include<Iot.cpp>
#include <string.h>
#include <string>
HardwareSerial SerialIot(1);
#define PIN_RX 2
#define PIN_TX 3
void setup()
{
  Serial.begin(9600);
  SerialIot.begin(9600, SERIAL_8N1, PIN_RX, PIN_TX);
}

2.实现串口调试助手上的数据接收发(下列举例风速变送器)

因为ESP32的板子上没有配置类似AT类的指令,因此需要自行编写一段代码来模拟

/*函数名称: Receice
*说明: 实现指令的交叉发送
*参数: 无
*返回值:无
*/
void Receive(void){
  String data = ""; 
   data = "";
  if(Serial.available())
  {
    data=Serial.readString();  //读取Serial串口缓存数组内的数据保存到rpy中
//    Serial.print("Receive: ");
    Serial.print(data);
    // Serial.flush();
    delay(100);
    SerialIot.print(data); //发送给iot
  }
  if(SerialIot.available()){
    data=SerialIot.readString();  //读取Serial串口缓存数组内的数据保存到rpy中
    // SerialIot.flush();
    delay(100);
//    Serial.print("Iot:");
    Serial.println(data); //发送给到串口调试助手
  }
}

接下来便可以简单实现使用串口调试助手进行调试

在串口调试助手上发送数据01 03 00 00 00 01 84 0A

明显看到发过去的数据为01 03 00 00 00 01 84 0A

收到的数据为01 03 02 00 00 B4 44,计算得到风速为0,和预想中的一致,数据的检验位也没问题,表明接收成功。

3.再通过代码代替串口调试助手实现数据的接收发

在485.cpp文件里写入

#include<485.h>
#include <HardwareSerial.h>

extern HardwareSerial SerialIot;

char item[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x03, 0x84, 0x0A}; 

/*函数名称: Receice
*说明: 实现指令的交叉发送
*参数: 无
*返回值:无
*/
void Receive(void){
  String data = ""; 
   data = "";
  if(Serial.available())
  {
    data=Serial.readString();  //读取Serial串口缓存数组内的数据保存到rpy中
//    Serial.print("Receive: ");
    Serial.print(data);
    // Serial.flush();
    delay(100);
    SerialIot.print(data); //发送给iot
  }
  if(SerialIot.available()){
    data=SerialIot.readString();  //读取Serial串口缓存数组内的数据保存到rpy中
    // SerialIot.flush();
    delay(100);
//    Serial.print("Iot:");
    Serial.println(data); //发送给到串口调试助手
  }
}

/*函数名称: get_windspeed
*说明: 实现将接收到的数据打印出来
*参数: 无
*返回值:无
*/
void get_windspeed(void){
  String data = ""; 
    while (SerialIot.available()){//从串口中读取数据
    unsigned char rpy = {};
    rpy = (unsigned char)SerialIot.read();  // read读取
    Serial.println(rpy);
    data += rpy;
    data += ',';
    }
    Serial.println(data);
  int commaPosition = -1;
  String info[8];  // 用字符串数组存储
  for (int i = 0; i < 8; i++) {
    commaPosition = data.indexOf(',');
    if (commaPosition != -1)
    {
      info[i] = data.substring(0, commaPosition);
      data = data.substring(commaPosition + 1, data.length());
    }
    else {
      if (data.length() > 0) {  // 最后一个会执行这个
        info[i] = data.substring(0, commaPosition);
      }
    }
  }
  Serial.println();
  Serial.print("windspeed:");
  Serial.println(info[3].toInt() * 256 + info[4].toInt() / 10.0);
  
}

/*函数名称: transmit_windspeed
*说明: 实现发送modbus数据格式的数据
*参数: 无
*返回值:无
*/
void transmit_windspeed(void){
  Serial.write(item,8);
}

注意modbus的十六进制转换,用write函数写入而不用print函数写入

再次在main.cpp函数里写入

#include <Arduino.h>
#include<485.cpp>
#include <string.h>
#include <string>
HardwareSerial SerialIot(1);
#define PIN_RX 2
#define PIN_TX 3
void setup()
{
  Serial.begin(9600);
  SerialIot.begin(9600, SERIAL_8N1, PIN_RX, PIN_TX);
}

void loop()
{
  transmit_windspeed();
  delay(1000);
  get_windspeed();
}

烧录运行,得到如图结果

成功接收到风速的数据。

实验成功!

四:注意要点

1.modbus数据格式的要求,熟悉起功能码和检验位(检验位记得及时更新)

2.十六进制和字符串之间的转换,利用多个函数进行提取输出输入。

3.在ESP32上可以编写“指令交叉发送函数”类的函数,便于调试和检验。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值