diff --git a/inc/rs485.h b/inc/rs485.h index efea633..1607e48 100644 --- a/inc/rs485.h +++ b/inc/rs485.h @@ -24,19 +24,29 @@ #define RS485_EN_PIN GPIO_PIN_1 -#define RX_BUFFER_SIZE 64 +#define RX_BUFFER_SIZE 32 -typedef enum { +#define LDC1612_PACKAGE_HEADER 0xD5 +#define LDC1612_BOARD_TYPE 0x03 +#define LDC1612_PACKAGE_LENGTH 0x02 + +typedef enum +{ VALIDATION_SUCCESS = 0, - VALIDATION_CRC_ERROR = 1 + VALIDATION_CRC_ERROR = 1, + VALIDATION_HEADER_ERROR = 2, + VALIDATION_TYPE_ERROR = 4, + VALIDATION_LENGTH_ERROR = 8 } validation_result_t; void rs485_config(void); -void process_command(uint8_t *cmd, size_t length); -uint8_t calculate_crc(uint8_t data[], size_t data_length); -validation_result_t validate_package_header(uint8_t *data); -validation_result_t validate_package_type(uint8_t *data); +void process_command(uint8_t* cmd, size_t length); +uint8_t calculate_crc(uint8_t data[], uint8_t data_length); +validation_result_t validate_package_crc(uint8_t* data, uint8_t data_length); +validation_result_t validate_package_header(uint8_t* data); +validation_result_t validate_package_type(uint8_t* data); +validation_result_t validate_data_length(uint8_t* data); void eddy_current_value_report(void); void tempture_value_report(void); -#endif //RS485_H \ No newline at end of file +#endif //RS485_H diff --git a/src/gd32e23x_it.c b/src/gd32e23x_it.c index b22650e..44c7960 100644 --- a/src/gd32e23x_it.c +++ b/src/gd32e23x_it.c @@ -129,21 +129,14 @@ void USART0_IRQHandler(void) { if (rx_index < RX_BUFFER_SIZE - 1) { rx_buffer[rx_index++] = received_data; } + } - // 检查是否接收到换行符,表示指令结束 - if (received_data == '\n') { - if (calculate_crc(rx_buffer, rx_index - 2) == rx_buffer[rx_index - 2]) { - // printf("CRC check success\r\n"); - // rx_buffer[rx_index] = '\0'; // 添加字符串结束符 - process_command(rx_buffer, rx_index); // 处理指令 - rx_index = 0; // 重置缓冲区索引 - } else { - // printf("CRC check failed\r\n"); - printf("%c%c%c%c\r\n", 0xB5, 0xF2, 0x00, 0xF2); - rx_index = 0; // 重置缓冲区索引 - return; - } + if (RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_IDLE)) { + usart_interrupt_flag_clear(USART0, USART_INT_FLAG_IDLE); - } + process_command(rx_buffer, rx_index); // 处理指令 + + rx_index = 0; // 重置缓冲区索引 + return; } } diff --git a/src/main.c b/src/main.c index 8ee1449..30bb31b 100644 --- a/src/main.c +++ b/src/main.c @@ -25,6 +25,7 @@ uint32_t g_eddy_current_value_uint32; \retval none */ int main(void) { + setbuf(stdout, NULL); /* configure systick */ systick_config(); /* configure USART */ @@ -35,7 +36,7 @@ int main(void) { i2c_gpio_config(); i2c_config(); - ldc1612_iic_get_sensor_infomation(); + // ldc1612_iic_get_sensor_infomation(); /* configure LDC1612 */ ldc1612_single_ch0_config(); diff --git a/src/peripheral.c b/src/peripheral.c deleted file mode 100644 index 7b0b1af..0000000 --- a/src/peripheral.c +++ /dev/null @@ -1,63 +0,0 @@ -// -// Created by yelv1 on 24-9-22. -// -#include "peripheral.h" -#include "gd32e23x.h" - -void usart_config(void) -{ - rcu_periph_clock_enable(RCU_GPIOA); - rcu_periph_clock_enable(RCU_USART0); - - gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_3); - gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_2); - - gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_3); - gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_3); - gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_2); - gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_2); - - usart_deinit(USART0); - usart_baudrate_set(USART0, 115200U); - usart_receive_config(USART0, USART_RECEIVE_ENABLE); - usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); - - usart_enable(USART0); - - gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_4); - gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4); - - gpio_bit_write(GPIOA, GPIO_PIN_4, SET); -} - -/*! - \brief led blink configuration - \param[in] none - \param[out] none - \retval none -*/ -void led_blink_config(void) -{ - rcu_periph_clock_enable(RCU_GPIOB); - - gpio_mode_set(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_1); - gpio_output_options_set(GPIOB, GPIO_OTYPE_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_1); - gpio_bit_write(GPIOB, GPIO_PIN_1, SET); - - rcu_periph_clock_enable(RCU_TIMER13); - timer_deinit(RCU_TIMER13); - - timer_parameter_struct timer_initpara; - timer_struct_para_init(&timer_initpara); - timer_initpara.prescaler =7199; - timer_initpara.alignedmode =TIMER_COUNTER_EDGE; - timer_initpara.counterdirection =TIMER_COUNTER_UP; - timer_initpara.period =999; - timer_initpara.clockdivision =TIMER_CKDIV_DIV1; - timer_init(TIMER13, &timer_initpara); - - timer_auto_reload_shadow_enable(TIMER13); - timer_interrupt_enable(TIMER13, TIMER_INT_UP); - nvic_irq_enable(TIMER13_IRQn, 0); - timer_enable(TIMER13); -} diff --git a/src/rs485.c b/src/rs485.c index 93d0499..35fe966 100644 --- a/src/rs485.c +++ b/src/rs485.c @@ -10,7 +10,8 @@ extern uint32_t g_eddy_current_value_uint32; uint8_t package_header[3] = {0xB5, 0xF0, 0x04}; uint8_t package_data[4] = {0}; -void rs485_config(void) { +void rs485_config(void) +{ rcu_periph_clock_enable(RS485_GPIO_RCU); rcu_periph_clock_enable(RS485_RCU); @@ -35,64 +36,120 @@ void rs485_config(void) { nvic_irq_enable(USART0_IRQn, 0); usart_interrupt_enable(RS485_PHY, USART_INT_RBNE); + usart_interrupt_enable(RS485_PHY, USART_INT_IDLE); } -void process_command(uint8_t *cmd, size_t length) { +void process_command(uint8_t* cmd, size_t length) +{ char combined_str[3]; + validation_result_t status = VALIDATION_SUCCESS; - if (cmd[0] == 0xD5) { - if (cmd[1] == 0x03) { - if (cmd[2] == 0x02) { - sprintf(combined_str, "%c%c", cmd[3], cmd[4]); - if (strcmp(combined_str, "M1") == 0) { + status = (validate_package_header(cmd) | validate_package_type(cmd) | validate_data_length(cmd) | validate_package_crc(cmd, length)); - eddy_current_value_report(); - } else if (strcmp(combined_str, "M2") == 0) { - tempture_value_report(); - } else { - printf("%c%c%c%c%c%c%c\r\n", 0xB5, 0xF0, 0x03, 0x65, 0x72, 0x72, 0x3C); - return; - } - } else { - printf("%c%c%c%c\r\n", 0xB5, 0xF1, 0x00, 0xF1); - } - } else { - printf("%c%c%c%c\r\n", 0xB5, 0xF5, 0x00, 0xF5); + switch (status) + { + case VALIDATION_SUCCESS: + // printf("%d", length); + sprintf(combined_str, "%c%c", cmd[3], cmd[4]); + if (strcmp(combined_str, "M1") == 0) + { + eddy_current_value_report(); } - } else { - printf("%c%c%c%c\r\n", 0xB5, 0xF3, 0x00, 0xF3); + else if (strcmp(combined_str, "M2") == 0) + { + tempture_value_report(); + } + else + { + printf("%c%c%c%c%c%c%c", 0xB5, 0xF0, 0x03, 0x65, 0x72, 0x72, 0x3C); + return; + } + break; + case VALIDATION_CRC_ERROR: + printf("%c%c%c%c%c%c%c", 0xB5, 0xF0, 0x03, 0x65, 0x72, 0x72, 0x3F); + break; + case VALIDATION_HEADER_ERROR: + printf("%c%c%c%c%c%c%c", 0xB5, 0xF3, 0x03, 0x65, 0x72, 0x72, 0x3F); + break; + case VALIDATION_TYPE_ERROR: + printf("%c%c%c%c%c%c%c", 0xB5, 0xF4, 0x03, 0x65, 0x72, 0x72, 0x3F); + break; + case VALIDATION_LENGTH_ERROR: + printf("%c%c%c%c%c%c%c", 0xB5, 0xF2, 0x03, 0x65, 0x72, 0x72, 0x3F); + break; + default: + break; } } -uint8_t calculate_crc(uint8_t data[], size_t data_length) { +uint8_t calculate_crc(uint8_t data[], uint8_t data_length) +{ uint8_t crc = 0; - for (size_t i = 1; i < data_length; i++) { + // printf("%d", data_length); + + for (uint8_t i = 1; i < data_length - 1; i++) + { crc += data[i]; } return (uint8_t)(crc & 0xFF); } -validation_result_t validate_package_header(uint8_t *data) { - if (data[0] == 0xD5) { +validation_result_t validate_package_crc(uint8_t* data, uint8_t data_length) +{ + if (data[data_length - 1] == calculate_crc(data, data_length) && data_length == 3 + data[2] + 1) + { return VALIDATION_SUCCESS; - } else { - printf("%c%c%c%c\r\n", 0xB5, 0xF3, 0x00, 0xF3); + } + else + { + // printf("%c%c%c%c", 0xB5, 0xF3, 0x00, 0xF3); return VALIDATION_CRC_ERROR; } } -validation_result_t validate_package_type(uint8_t *data) { - if (data[1] == 0x03) { +validation_result_t validate_package_header(uint8_t* data) +{ + if (data[0] == LDC1612_PACKAGE_HEADER) + { return VALIDATION_SUCCESS; - } else { - printf("%c%c%c%c\r\n", 0xB5, 0xF3, 0x00, 0xF3); - return VALIDATION_CRC_ERROR; + } + else + { + // printf("%c%c%c%c", 0xB5, 0xF3, 0x00, 0xF3); + return VALIDATION_HEADER_ERROR; } } -void eddy_current_value_report(void) { +validation_result_t validate_package_type(uint8_t* data) +{ + if (data[1] == LDC1612_BOARD_TYPE) + { + return VALIDATION_SUCCESS; + } + else + { + // printf("%c%c%c%c", 0xB5, 0xF3, 0x00, 0xF3); + return VALIDATION_TYPE_ERROR; + } +} + +validation_result_t validate_data_length(uint8_t* data) +{ + if (data[2] == LDC1612_PACKAGE_LENGTH) + { + return VALIDATION_SUCCESS; + } + else + { + // printf("%c%c%c%c", 0xB5, 0xF3, 0x00, 0xF3); + return VALIDATION_LENGTH_ERROR; + } +} + +void eddy_current_value_report(void) +{ // package_header[1] = 0xF0; //eddy current package_data[0] = (g_eddy_current_value_uint32 >> 24) & 0xFF; @@ -107,10 +164,11 @@ void eddy_current_value_report(void) { // printf("EddyCurrent: %x\r\n", g_eddy_current_value_uint32); printf("%c%c%c", package_header[0], package_header[1], package_header[2]); printf("%c%c%c%c", package_data[0], package_data[1], package_data[2], package_data[3]); - printf("%c\r\n", calculate_crc(combined_data, 7)); + printf("%c", calculate_crc(combined_data, 7)); } -void tempture_value_report(void) { +void tempture_value_report(void) +{ // package_header[1] = 0xF1; //temperature package_data[0] = (g_temperature_uint32 >> 24) & 0xFF; @@ -125,5 +183,5 @@ void tempture_value_report(void) { // printf("Temperature: %x\r\n", g_temperature_uint32); printf("%c%c%c", package_header[0], package_header[1], package_header[2]); printf("%c%c%c%c", package_data[0], package_data[1], package_data[2], package_data[3]); - printf("%c\r\n", calculate_crc(combined_data, 7)); + printf("%c", calculate_crc(combined_data, 7)); }