写在前面
前面学习了ESP32串口的使用,今天研究一下串口读写16进制数据包。
ESP32开发板 -- TTL转RS485 -- 无刷电机驱动器 -- 无刷电机
● 通过ESP32串口发送16进制数据包,控制无刷电机的启动和停止
● 通过ESP32串口接收16进制数据包,读取驱动器返回的数据
测试代码
#include <HardwareSerial.h> //导入ESP32串口操作库
HardwareSerial MySerial(2); //初始化对象MySerial,使用2号串口
unsigned char testcode1[8]; //定义数据包1
unsigned char testcode2[8]; //定义数据包2
//读取函数
void serialRead()
{
//如果串口2的缓冲区有数据
if (MySerial.available())
{
//定义数据储存数组
byte receivedData[8];
//读取串口2
MySerial.readBytes(receivedData, 8);
//在串口1打印读取的内容
Serial.print("Received data: ");
for (int i = 0; i < 8; i++)
{
Serial.print(receivedData[i], HEX);
Serial.print(" ");
}
Serial.println();
}
}
void setup()
{
//启用串口0
Serial.begin(9600);
//定义串口2参数(波特率,数据位,奇偶校验,停止位,RXD引脚,TXD引脚)
MySerial.begin(9600, SERIAL_8E1, 16, 17);
//数据包1(无刷电机启动)
testcode1[0] = 0x01;
testcode1[1] = 0x06;
testcode1[2] = 0x00;
testcode1[3] = 0x42;
testcode1[4] = 0x01;
testcode1[5] = 0xF4;
testcode1[6] = 0x29;
testcode1[7] = 0xC9;
//数据包2(无刷电机停止)
testcode2[0] = 0x01;
testcode2[1] = 0x06;
testcode2[2] = 0x00;
testcode2[3] = 0x40;
testcode2[4] = 0x00;
testcode2[5] = 0x01;
testcode2[6] = 0x49;
testcode2[7] = 0xDE;
}
void loop()
{
//发送数据包1,电机启动
Serial.println("start");
MySerial.write(testcode1,sizeof(testcode1));
//延时
delay(100);
//读取驱动器返回数据
serialRead();
delay(5000);
//发送数据包2,电机停止
Serial.println("stop");
MySerial.write(testcode2,sizeof(testcode2));
//延时
delay(100);
//读取驱动器返回数据
serialRead();
delay(5000);
}
测试结果
注意事项
1、运行 Serial.readBytes() 函数之后,会将数据缓存区中已经读过的内容清除。
2、由于接收数据需要时间,所以在读取数据之前,应适当延时。
3、参照下面的文章,尝试用中断的方式,读取串口数据,失败。