0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用chatGPT编写一段STM32协议解析的程序

玩转单片机与嵌入式 来源:玩转单片机与嵌入式 2023-09-05 10:44 次阅读

随着chatGPT的火爆,在网上纷纷讨论最先被chatGPT淘汰的会是什么行业,其中类似小编的“程序员”赫然在列,并且排名前三。

3112af3c-4b90-11ee-a25d-92fbcf53809c.png

起初,小编不信邪,我们是编写出AI程序的人员,怎么可能会被AI淘汰。最近,当我尝试让chatGPT编写一段协议解析的代码时,彻底被震惊到!

一:第一次命令输入

当我向chatGPT输入我的协议格式时,chatGPT直接根据我的要求输出了完成的源代码。

31591b84-4b90-11ee-a25d-92fbcf53809c.png

31684dfc-4b90-11ee-a25d-92fbcf53809c.png

316fcc26-4b90-11ee-a25d-92fbcf53809c.png

下面将源码贴上

#include "stm32f4xx_hal.h"


#define PACKET_START_BYTE 0x7E
#define PACKET_END_BYTE   0x7E
#define MAX_PACKET_SIZE   20 // 最大数据包大小,根据实际情况调整


typedef struct {
  uint8_t device_address;
  uint8_t command;
  uint8_t data_length;
  uint8_t data[MAX_PACKET_SIZE];
  uint8_t checksum;
  uint8_t is_valid;
} SerialPacket;


SerialPacket received_packet;


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
  static uint8_t buffer[MAX_PACKET_SIZE];
  static uint8_t buffer_index = 0;
  static uint8_t is_inside_packet = 0;


  if (huart == &huart2) {
    if (!is_inside_packet) {
      if (buffer_index == 0 && received_byte == PACKET_START_BYTE) {
        is_inside_packet = 1;
        buffer[buffer_index++] = received_byte;
      }
    } else {
      buffer[buffer_index++] = received_byte;


      if (buffer_index >= 4) {
        uint8_t data_length = buffer[3] - 2; // 计算数据区长度(不包括校验和和包尾)


        if (buffer_index == (data_length + 6)) { // 收到完整的数据包
          received_packet.device_address = buffer[1];
          received_packet.command = buffer[2];
          received_packet.data_length = data_length;


          for (int i = 0; i < data_length; i++) {
            received_packet.data[i] = buffer[4 + i];
          }


          received_packet.checksum = buffer[data_length + 4];
          received_packet.is_valid = 1;


          // 处理接收到的数据包,例如执行相应的命令
          // ...


          // 复位接收缓冲区和状态
          buffer_index = 0;
          is_inside_packet = 0;
        }
      }
    }


    HAL_UART_Receive_IT(&huart2, &received_byte, 1); // 启动下一次接收中断
  }
}


int main(void) {
  // 初始化HAL库和串口2
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_USART2_UART_Init();


  // 启动接收中断
  HAL_UART_Receive_IT(&huart2, &received_byte, 1);


  while (1) {
    // 在这里可以执行其他任务
    // ...
  }
}
通过上面的代码分析可以发现,当我仅仅经过一次“命令输入”,chatGPT竟然产生了如此准确的协议解析的代码。震惊小编的位置主要是:

1、竟然将协议头、数据长度等内容使用宏定义的形式体现:一般的初级程序员没有如此良好的编程习惯,将常量定义为易读和已改的宏定义。
#define PACKET_START_BYTE 0x7E
#define PACKET_END_BYTE   0x7E
#define MAX_PACKET_SIZE   20 // 最大数据包大小,根据实际情况调整
2、整个编码解析的过程,符合我的要求。并且函数中使用了结构体、指针等初级程序员不喜欢使用的元素。

二:第二次命令输入

当小编对chatGPT进行再次重新输入命令后的调整;chatGPT输出了我们

31a9b260-4b90-11ee-a25d-92fbcf53809c.png

#include "stm32f4xx_hal.h"


#define PACKET_START_BYTE 0x7E
#define PACKET_END_BYTE   0x7E
#define MAX_PACKET_SIZE   20 // 最大数据包大小,根据实际情况调整


UART_HandleTypeDef huart2;


typedef struct {
    uint8_t device_address;
    uint8_t command;
    uint8_t data_length;
    uint8_t data[MAX_PACKET_SIZE];
    uint8_t checksum;
    uint8_t is_valid;
} SerialPacket;


SerialPacket received_packet;


// 接收缓冲区
uint8_t rx_buffer[MAX_PACKET_SIZE];
uint8_t rx_buffer_index = 0;
uint8_t is_inside_packet = 0;


void process_received_data() {
    // 在这里可以解析和处理接收到的数据包
    // 访问 received_packet 中的数据进行解析
    // 例如,你可以根据 received_packet.command 执行相应的操作
    // ...


    // 清除接收缓冲区,准备接收下一个数据包
    memset(rx_buffer, 0, sizeof(rx_buffer));
    rx_buffer_index = 0;
    is_inside_packet = 0;
}


void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
    if (huart == &huart2) {
        if (!is_inside_packet) {
            if (rx_buffer_index == 0 && rx_buffer[0] == PACKET_START_BYTE) {
                is_inside_packet = 1;
            }
        } else {
            rx_buffer[rx_buffer_index++] = received_byte;


            if (rx_buffer_index >= 4) {
                uint8_t data_length = rx_buffer[3] - 2; // 计算数据区长度(不包括校验和和包尾)


                if (rx_buffer_index == (data_length + 6)) { // 收到完整的数据包
                    received_packet.device_address = rx_buffer[1];
                    received_packet.command = rx_buffer[2];
                    received_packet.data_length = data_length;


                    for (int i = 0; i < data_length; i++) {
                        received_packet.data[i] = rx_buffer[4 + i];
                    }


                    received_packet.checksum = rx_buffer[data_length + 4];
                    received_packet.is_valid = 1;


                    process_received_data(); // 处理接收到的数据包


                    // 启动下一次接收中断
                    HAL_UART_Receive_IT(&huart2, rx_buffer, 1);
                }
            }
        }
    }
}


int main(void) {
    // 初始化HAL库和串口2
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART2_UART_Init();


    // 启动接收中断
    HAL_UART_Receive_IT(&huart2, rx_buffer, 1);


    while (1) {
        // 在这里可以执行其他任务
        // ...
    }
}

经过第二次的调整,已经产生了满足我的要求的源代码文件。

三:总结及应对挑战

经过两次短暂的输入,chatGPT即产生了“初级程序员”所具备的能力编写的代码。当随着我们命令的更深层次的输入,chatGPT肯定会产生更符合我们要求的内容/代码。 作为嵌入式工程师,ChatGPT的强大功能可能对我们构成潜在竞争和挑战。 为应对这种竞争和挑战,我们需要采取各类措施来应对挑战:如下的内容也是chatGPT告诉我们的:

31cf038a-4b90-11ee-a25d-92fbcf53809c.png

其中一条:持续学习和更新技能,在任何时代、任何领域都是保持自身竞争力的手段之一。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2240

    文章

    10674

    浏览量

    348788
  • AI
    AI
    +关注

    关注

    87

    文章

    26458

    浏览量

    264072
  • 程序
    +关注

    关注

    114

    文章

    3631

    浏览量

    79546
  • 源码
    +关注

    关注

    8

    文章

    574

    浏览量

    28589
  • ChatGPT
    +关注

    关注

    27

    文章

    1409

    浏览量

    4749

原文标题:我用chatGPT产生了一个STM32协议解析的程序,实锤了chatGPT最先淘汰的行业是程序员!

文章出处:【微信号:玩转单片机与嵌入式,微信公众号:玩转单片机与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    【国产FPGA+OMAPL138开发板体验】(原创)6.FPGA连接ChatGPT 4

    OMAP-L138(定点/浮点DSP C674x+ARM9)+ FPGA处理器的开发板。 编写个用于FPGA访问ChatGPT 4的程序代码是
    发表于 02-14 21:58

    LABVIEW注释一段程序

    LABVIEW中如何注释一段程序,运行时确保注释的这段程序不被使用,就如C/C++等……
    发表于 12-29 14:24

    一段程序将ARM内部FLASH中的一段数据通过UART0发送到电脑

    本帖最后由 柠檬お香 于 2013-5-20 10:43 编辑 写一段程序将ARM内部FLASH中的一段数据通过UART0发送到电脑,要求设计通信协议
    发表于 05-20 09:57

    一段C语言程序

    一段用51单片机+1602液晶+ds18b20+ds1302+1838红外遥控的C语言程序.......没别的意思,也不会抄袭的,就是想能参考下,{:12:}
    发表于 08-03 19:49

    如何用STM32来播放一段录音?

    想用STM32和GSM来做个拨通电话后自动播放一段录音的东西,不懂STM32如何实现
    发表于 03-26 09:08

    如何利用labview设置个标志位啊请问?每次程序结果为true时增加1,当标志位为2时就执行另外一段程序

    `每次程序结果为true时增加1,当标志位为2时就利用事件结构去执行另外一段程序,事件结构中程序中执行完后就清零标志位。谢谢了!`
    发表于 06-25 19:48

    一段STM32控制舵机的程序,谢谢!

    一段STM32控制舵机的程序,谢谢!
    发表于 09-23 11:43

    急求msp430f149利用AD测量一段脉冲信号的频率或者周期的c语言程序

    急求msp430f149利用AD测量一段脉冲信号的频率或者周期的c语言程序
    发表于 03-30 09:12

    请问如何编写程序控制flash,来定义一段的指定空间作为自由存储区?

    要在flash中开辟一段存储空间,能够自由地进行读写,请问应该如何编写程序
    发表于 06-12 19:42

    请问28377D如何指定一段程序由CPU1执行,另一段程序在CPU2中执行

    28377D如何指定一段程序由CPU1执行 ,另一段程序在CPU2中执行
    发表于 12-06 10:44

    一段程序

    想在该程序上加一段关于运行中启停键按下,暂停运行,再次按下恢复运行的程序,希望越简单越好,关于这方面学的不好,麻烦帮帮忙,谢谢大佬
    发表于 12-23 15:28

    怎样去编写一段ARM汇编程序

    编写一段 ARM 汇编程序:循环累加队列 rjarray 中的所有元素,直到碰上零值元素,结果放在 r4 中 AREAtotal,CODE,READONLY ENTRYStartMOVr4,#0
    发表于 12-14 07:46

    用汇编编写STM32启动文件分析

    同系列不同型号的SOC进行工程适配时,般只需要更改SOC型号、SOC宏定义及启动文件即可。启动文件解析首先进行堆和栈的初始化  伪指令 EQU 作用是将个确定的数值赋给个变量名。
    发表于 02-17 06:29

    科技大厂竞逐AIGC,中国的ChatGPT在哪?

    言”(ERNIE Bot),并表示预计在3月完成内测。随后一段时间,阿里巴巴、360、科大讯飞、腾讯等多家国内企业纷纷表示对AI技术发展的关注。2月10日,京东云宣布旗下言犀人工智能应用平台将推出
    发表于 03-03 14:28

    ChatGPT编写各种脚本

    最牛逼的还是属于程序编写方面,ChatGPT在各个编程语言上面都挺在行的(尝试了下Python, Perl, Tcl都挺不错的),可以说是一个各个语言都很了解的程序员了。
    的头像 发表于 01-13 10:11 6917次阅读