一:实现功能
在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();
}
烧录运行,得到如图结果
成功接收到风速的数据。
实验成功!