ESP32学习笔记-串口读写16进制数据包

本文介绍了如何使用ESP32通过串口发送和接收16进制数据包来控制无刷电机的启动和停止,涉及硬件连接、测试代码和注意事项,包括清除缓存和中断尝试等内容。
摘要由CSDN通过智能技术生成

写在前面

前面学习了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、参照下面的文章,尝试用中断的方式,读取串口数据,失败。

参考

ESP32串口通信 双机串口通信_esp32读取串口数据-CSDN博客

Arduino学习(七)中断_arduino 中断优先级-CSDN博客

1. 首先需要配置串口的参数,包括波特率、数据位、停止位、校验位等,可以使用以下代码进行配置: ``` #include "driver/uart.h" void uart_init() { uart_config_t uart_config = { .baud_rate = 115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE }; uart_param_config(UART_NUM_1, &uart_config); uart_set_pin(UART_NUM_1, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); uart_driver_install(UART_NUM_1, 1024, 0, 0, NULL, 0); } ``` 2. 接着需要在主函数中调用`uart_init()`函数进行串口初始化。 3. 在主函数中使用`uart_read_bytes()`函数串口数据,可以使用以下代码: ``` uint8_t data[1024]; int len = uart_read_bytes(UART_NUM_1, data, sizeof(data), 1000 / portTICK_RATE_MS); if (len > 0) { // 处理接收到的数据 } ``` 其中,`UART_NUM_1`表示要取的串口号,`data`为接收数据的缓冲区,`sizeof(data)`表示缓冲区大小,`1000 / portTICK_RATE_MS`表示取数据的超时时间,单位为毫秒。 4. 处理接收到的数据,可以使用以下代码: ``` for (int i = 0; i < len; i++) { printf("%c", data[i]); } ``` 5. 最后需要在`main()`函数中添加以下代码,使程序可以一直运行: ``` while (1) { vTaskDelay(1000 / portTICK_RATE_MS); } ``` 完整代码如下: ``` #include "driver/uart.h" void uart_init() { uart_config_t uart_config = { .baud_rate = 115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE }; uart_param_config(UART_NUM_1, &uart_config); uart_set_pin(UART_NUM_1, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); uart_driver_install(UART_NUM_1, 1024, 0, 0, NULL, 0); } void app_main() { uart_init(); uint8_t data[1024]; while (1) { int len = uart_read_bytes(UART_NUM_1, data, sizeof(data), 1000 / portTICK_RATE_MS); if (len > 0) { for (int i = 0; i < len; i++) { printf("%c", data[i]); } } vTaskDelay(1000 / portTICK_RATE_MS); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值