随着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告诉我们的: