社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  chatgpt

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

嵌入式微处理器 • 6 月前 • 174 次点击  
随着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) { // 在这里可以执行其他任务 // ... }}
经过第二次的调整,已经产生了满足我的要求的源代码文件。

三、总结及应对挑战

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

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

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

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

END

来源:玩转单片机与嵌入式

版权归原作者所有,如有侵权,请联系删除

推荐阅读
为什么大厂都在用Yocto?
培养一个优秀的嵌入式工程师有多难?
C/C++大限将至,美国强硬要求2026年前全面剔除!

→点关注,不迷路←

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/176150
 
174 次点击