随着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竟然产生了如此准确的协议解析的代码。震惊小编的位置主要是:
#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告诉我们的:
其中一条:持续学习和更新技能,在任何时代、任何领域都是保持自身竞争力的手段之一。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !