EBIKE-FreeRTOS/Source/HC-04.c
2024-04-14 18:38:39 +08:00

106 lines
2.3 KiB
C

#include "HC-04.h"
#include "common.h"
uint8_t HC04_DATA[1024] = { 0 };
int HC04_DATA_LEN = 0;
int HC_04_UART_INIT(int pio)
{
// 初始化UART
if (pio == 1) {
uint tx_offset = pio_add_program(HC_04_PIO, &uart_tx_program);
uart_tx_program_init(HC_04_PIO, HC_04_PIO_SM_TX, tx_offset, HC_04_PIO_TX_PIN, HC_04_PIO_SERIAL_BAUD);
uint rx_offset = pio_add_program(HC_04_PIO, &uart_rx_program);
uart_rx_program_init(HC_04_PIO, HC_04_PIO_SM_RX, rx_offset, HC_04_PIO_RX_PIN, HC_04_PIO_SERIAL_BAUD);
}
return 0;
}
int HC_04_PIO_UART_TX_DATA(PIO pio, uint sm, char *DATA, int DATA_LEN)
{
for (int i = 0; i < DATA_LEN; i++) {
uart_tx_program_putc(pio, sm, DATA[i]);
sleep_ms(1);
}
return 0;
}
int HC_04_PIO_UART_RX_DATA(PIO pio, uint sm, uint8_t * DATA, int DATA_LEN)
{
char c = '\0';
int received_count = 0;
int timeout_ms = 1000; // 设置较长的超时时间
while (received_count < DATA_LEN && timeout_ms > 0) {
if (uart_rx_program_available(pio, sm)) {
c = uart_rx_program_getc(pio, sm);
DATA[received_count++] = c;
//printf("0x%X ", c);
} else {
// 没有接收到数据,继续等待
sleep_ms(2);
timeout_ms--;
}
}
if (received_count == 0) {
// 没有接收到有效数据
return -1;
}
return received_count;
}
void HC_04_UART_WRITE(void *p)
{
(void)p;
/*
AT+RESET // 重启
AT+RX // 查询模块多个参数
*/
char _CMD0[] = "AT+RX"; // 查询
// 发送数据
HC_04_PIO_UART_TX_DATA(HC_04_PIO, HC_04_PIO_SM_TX, _CMD0, sizeof(_CMD0));
}
void HC_04_UART_READ(void *p)
{
(void)p;
//printf("HC-04 Module\n");
memset(HC04_DATA, 0, 1024);
if (0 >= HC_04_PIO_UART_RX_DATA(HC_04_PIO, HC_04_PIO_SM_RX, HC04_DATA, 270)) {
;
} else {
if (0 < strlen((char *)HC04_DATA)) {
printf("%s\n", HC04_DATA);
memset(HC04_DATA, 0, 1024);
}
}
return;
}
void HC_04(void *p)
{
(void)p;
HC_04_UART_INIT(1);
while (1) {
HC_04_UART_WRITE(NULL);
HC_04_UART_READ(NULL);
printf("\n");
vTaskDelay(pdMS_TO_TICKS(3000)); // 非阻塞延时
}
return ;
}