专栏名称: 嵌入式微处理器
关注这个时代最火的嵌入式微处理器,你想知道的都在这里。
目录
相关文章推荐
新疆949交通广播  ·  18岁小伙失联获救,付费8万!救援者:首次收 ... ·  昨天  
封面新闻  ·  铜梁龙马明日开跑! ·  昨天  
封面新闻  ·  铜梁龙马明日开跑! ·  昨天  
新疆949交通广播  ·  刚刚,利好传来!事关AI→ ·  昨天  
新疆949交通广播  ·  正式实施!驾驶证申领政策有变 ·  3 天前  
51好读  ›  专栏  ›  嵌入式微处理器

我用ChatGPT产生了一个STM32协议解析的程序,实锤了它最先淘汰的是程序员!

嵌入式微处理器  · 公众号  ·  · 2024-11-21 12:00

正文

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

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

一、第一次命令输入

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

下面将源码贴上:

#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输出了完整的示例代码:

#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) { // 在这里可以执行其他任务 // ... }}
经过第二次的调整,已经产生了满足我的要求的源代码文件。

三、总结及应对挑战

经过两次短暂的输入, C hatGPT即产生了“初级程序员”所具备的能力编写的代码。当随着我们命令的更深层次的输入, C hatGPT肯定会产生更符合我们要求的内容/代码。

作为嵌入式工程师,ChatGPT的强大功能可能对我们构成潜在竞争和挑战。

为应对这种竞争和挑战,我们需要采取各类措施来应对挑战:如下的内容也是 C hatGPT告诉我们的:







请到「今天看啥」查看全文