重写了和报警器端的交互方式,测试通过

This commit is contained in:
小马_666 2025-01-02 13:42:24 +08:00
parent ddc0ca7706
commit 29bfea488d
5 changed files with 67 additions and 41 deletions

View File

@ -1148,10 +1148,8 @@ int BSP_Master_Send(centralConnItem_t *centralConnList, uint8_t id, uint8_t *Dat
if (centralConnList[id].state == BLE_STATE_CONNECTED) // 检查连接状态是否为连接状态 if (centralConnList[id].state == BLE_STATE_CONNECTED) // 检查连接状态是否为连接状态
{ {
logDebug("BLE_STATE_CONNECTED");
if (centralConnList[id].procedureInProgress == FALSE) if (centralConnList[id].procedureInProgress == FALSE)
{ {
logDebug("FALSE");
req.cmd = FALSE; req.cmd = FALSE;
req.sig = FALSE; req.sig = FALSE;
req.handle = centralConnList[id].charHd3; req.handle = centralConnList[id].charHd3;

View File

@ -2,7 +2,7 @@
* @Author: mbw * @Author: mbw
* @Date: 2024-12-06 16:52:29 * @Date: 2024-12-06 16:52:29
* @LastEditors: mbw && 1600520629@qq.com * @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-14 14:51:37 * @LastEditTime: 2025-01-02 11:22:39
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\inc\bsp_uart.h * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\inc\bsp_uart.h
* @Description: * @Description:
* @ * @
@ -17,6 +17,7 @@
#define BT_REC_EVT (0X01 << 1) #define BT_REC_EVT (0X01 << 1)
#define BT_INFO_UPDATA_EVT (0X01 << 2) #define BT_INFO_UPDATA_EVT (0X01 << 2)
#define BT_SEND_EVT (0X01 << 3)// #define BT_SEND_EVT (0X01 << 3)//
#define BT_REC_EVT_FINISH (0X01 << 4) //接收完成事件
#define UART3_RX_PIN GPIO_Pin_20 //PB20 #define UART3_RX_PIN GPIO_Pin_20 //PB20
#define UART3_TX_PIN GPIO_Pin_21 // PB21 #define UART3_TX_PIN GPIO_Pin_21 // PB21

View File

@ -2,7 +2,7 @@
* @Author: mbw * @Author: mbw
* @Date: 2024-12-06 14:49:21 * @Date: 2024-12-06 14:49:21
* @LastEditors: mbw && 1600520629@qq.com * @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-17 09:36:33 * @LastEditTime: 2025-01-02 13:18:15
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_flash.c * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_flash.c
* @Description: MAC地址等关键信息进行保存和读取操作 * @Description: MAC地址等关键信息进行保存和读取操作
* *
@ -36,7 +36,7 @@ int Flash_Write_ConfigInfo(uint8_t *page_buf)
int Flash_Set_Mac_Addr(uint8_t *mac_addr, uint8_t number) int Flash_Set_Mac_Addr(uint8_t *mac_addr, uint8_t number)
{ {
uint8_t page_buf[DATA_FLASH_PAGE_SIZE] = {0}; uint8_t page_buf[DATA_FLASH_PAGE_SIZE] = {0};
uint8_t in_page_offset = ((FLASH_MAC_1_ADDR + number * FLASH_MAC_INFO_LEN) - FLASH_MAC_INFO_START_ADDR); uint8_t in_page_offset = ((FLASH_MAC_INFO_START_ADDR + (number - 1) * FLASH_MAC_INFO_LEN) - FLASH_MAC_INFO_START_ADDR);
if ((mac_addr == NULL)||( number > MAX_VALVE_NUM)) if ((mac_addr == NULL)||( number > MAX_VALVE_NUM))
{ {
return -1; return -1;
@ -53,17 +53,9 @@ int Flash_Set_Mac_Addr(uint8_t *mac_addr, uint8_t number)
int Flash_Get_Mac_Addr(uint8_t *mac_addr, uint8_t number) int Flash_Get_Mac_Addr(uint8_t *mac_addr, uint8_t number)
{ {
__attribute__((aligned(4))) __attribute__((aligned(4)))
uint8_t data[FLASH_MAC_INFO_LEN + 2]; // 读写buf需要4字节对齐 uint8_t data[FLASH_MAC_INFO_LEN]; // 读写buf需要4字节对齐
EEPROM_READ((FLASH_MAC_INFO_START_ADDR + number * FLASH_MAC_INFO_LEN), data, FLASH_MAC_INFO_LEN); EEPROM_READ((FLASH_MAC_INFO_START_ADDR + (number - 1) * FLASH_MAC_INFO_LEN), mac_addr, FLASH_MAC_INFO_LEN);
if (tmos_isbufset(data, 0xFF, FLASH_MAC_INFO_LEN)) DelayMs(2);
{
logDebug("MAC地址为空,请先配网");
tmos_memset(mac_addr, 0xFF, FLASH_MAC_INFO_LEN);
return -1;
}
tmos_memcpy(mac_addr, data, FLASH_MAC_INFO_LEN);
return 0; return 0;
} }
@ -75,14 +67,17 @@ int Flash_Set_Valve_Num(uint8_t valve_num)
uint8_t in_page_offset = (FLASH_MAC_NUM_ADDR - FLASH_INFO_ADDR); uint8_t in_page_offset = (FLASH_MAC_NUM_ADDR - FLASH_INFO_ADDR);
Flash_ErasePage_ReadConfigInfo(page_buf); Flash_ErasePage_ReadConfigInfo(page_buf);
page_buf[in_page_offset] = valve_num; page_buf[in_page_offset] = valve_num;
return Flash_Write_ConfigInfo(page_buf); return Flash_Write_ConfigInfo(page_buf);
} }
/*获取无线调压器数量*/ /*获取无线调压器数量*/
uint8_t Flash_Get_Valve_Num(void) uint8_t Flash_Get_Valve_Num(void)
{ {
uint8_t num; uint8_t num;
EEPROM_READ(FLASH_MAC_NUM_ADDR, &num, FLASH_MAC_NUM_LEN); EEPROM_READ(FLASH_MAC_NUM_ADDR, &num, FLASH_MAC_NUM_LEN);
DelayMs(2);
if (num != 0xFF) if (num != 0xFF)
{ {
return num; return num;
@ -91,18 +86,20 @@ uint8_t Flash_Get_Valve_Num(void)
{ {
return 0; return 0;
} }
} }
void BSP_FLASH_Init(void) void BSP_FLASH_Init(void)
{ {
uint32_t flash_write_flag = 0; uint32_t flash_write_flag = 0;
EEPROM_READ(FLASH_INFO_WRITE_FLAG_ADDR, &flash_write_flag, FLASH_INFO_WRITE_FLAG_LEN); EEPROM_READ(FLASH_INFO_WRITE_FLAG_ADDR, &flash_write_flag, FLASH_INFO_WRITE_FLAG_LEN);
DelayMs(2);
if (flash_write_flag != FLASH_INFO_WRITE_FLAG_VAL) // 用以防止刷掉写入的数据 if (flash_write_flag != FLASH_INFO_WRITE_FLAG_VAL) // 用以防止刷掉写入的数据
{ {
flash_write_flag = FLASH_INFO_WRITE_FLAG_VAL; flash_write_flag = FLASH_INFO_WRITE_FLAG_VAL;
// 擦除数据 // 擦除数据
EEPROM_ERASE(FLASH_INFO_ADDR, DATA_FLASH_PAGE_SIZE); // 擦除待写区 EEPROM_ERASE(FLASH_INFO_ADDR, DATA_FLASH_PAGE_SIZE); // 擦除待写区
DelayMs(2);
EEPROM_WRITE(FLASH_INFO_WRITE_FLAG_ADDR, &flash_write_flag, FLASH_INFO_WRITE_FLAG_LEN); EEPROM_WRITE(FLASH_INFO_WRITE_FLAG_ADDR, &flash_write_flag, FLASH_INFO_WRITE_FLAG_LEN);
DelayMs(2);
} }
} }

View File

@ -2,7 +2,7 @@
* @Author: mbw * @Author: mbw
* @Date: 2024-12-06 16:52:30 * @Date: 2024-12-06 16:52:30
* @LastEditors: mbw && 1600520629@qq.com * @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-17 14:17:49 * @LastEditTime: 2025-01-02 11:38:30
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_uart.c * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_uart.c
* @Description: * @Description:
* *
@ -29,6 +29,8 @@
#define UART3_RX_BUFFER_LENGTH 1024U #define UART3_RX_BUFFER_LENGTH 1024U
#define UART3_TX_BUFFER_LENGTH 2048U #define UART3_TX_BUFFER_LENGTH 2048U
uint8_t bt_recv_start_flag = 0;
uint8_t bt_recv_end_flag = 0;
lwrb_t uart1_rx_t; lwrb_t uart1_rx_t;
lwrb_t uart1_tx_t; lwrb_t uart1_tx_t;
uint8_t uart1_tx_buf[UART1_TX_BUFFER_LENGTH] = {0}; uint8_t uart1_tx_buf[UART1_TX_BUFFER_LENGTH] = {0};
@ -324,24 +326,39 @@ uint16_t BT_ProcessEvent(uint8_t task_id, uint16_t events)
{ {
lwrb_reset(&uart1_rx_t); lwrb_reset(&uart1_rx_t);
lwrb_reset(&uart1_tx_t); lwrb_reset(&uart1_tx_t);
tmos_start_task(task_id, BT_REC_EVT, 800); tmos_start_task(task_id, BT_REC_EVT_FINISH, 100);
return (events ^ BT_START_EVT); return (events ^ BT_START_EVT);
} }
else if (events & BT_REC_EVT_FINISH)
{
if (bt_recv_start_flag)
{
bt_recv_start_flag = 0;
bt_recv_end_flag = 1;
tmos_start_task(task_id, BT_REC_EVT, 100);
}
tmos_start_task(task_id, BT_REC_EVT_FINISH, 50);
return (events ^ BT_REC_EVT_FINISH);
}
else if (events & BT_REC_EVT) else if (events & BT_REC_EVT)
{ {
int len = lwrb_get_full(&uart1_rx_t); logDebug("BT_REC_EVT");
if (len > 0) if (bt_recv_end_flag)
{ {
__attribute__((aligned(4))) uint8_t buf[256] = {0}; bt_recv_end_flag = 0;
lwrb_read(&uart1_rx_t, buf, len); int len = lwrb_get_full(&uart1_rx_t);
ret = BSP_Bt_Process(buf, len); if (len > 0)
if (ret != 0)
{ {
logError("BT 操作失败[%d]", ret); __attribute__((aligned(4))) uint8_t buf[256] = {0};
lwrb_read(&uart1_rx_t, buf, len);
ret = BSP_Bt_Process(buf, len);
if (ret != 0)
{
logError("BT 操作失败[%d]", ret);
}
} }
} }
tmos_start_task(task_id, BT_REC_EVT, 100);
return (events ^ BT_REC_EVT); return (events ^ BT_REC_EVT);
} }
else if (events & BT_SEND_EVT) else if (events & BT_SEND_EVT)
@ -414,6 +431,10 @@ void UART1_IRQHandler(void)
} }
case UART_II_RECV_RDY: case UART_II_RECV_RDY:
case UART_II_RECV_TOUT: // 接收数据 case UART_II_RECV_TOUT: // 接收数据
if ((bt_recv_start_flag == 0)&&(bt_recv_end_flag == 0))//用于检测是否是开始接收数据
{
bt_recv_start_flag = 1;
}
while (R8_UART1_RFC) while (R8_UART1_RFC)
{ {
data = R8_UART1_RBR; data = R8_UART1_RBR;

View File

@ -2,7 +2,7 @@
* @Author: mbw * @Author: mbw
* @Date: 2024-12-09 11:40:10 * @Date: 2024-12-09 11:40:10
* @LastEditors: mbw && 1600520629@qq.com * @LastEditors: mbw && 1600520629@qq.com
* @LastEditTime: 2024-12-17 14:43:12 * @LastEditTime: 2025-01-02 13:24:41
* @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_valve.c * @FilePath: \ble_-tyq_-bjq_-ch584-m\bsp\src\bsp_valve.c
* @Description: * @Description:
* *
@ -81,7 +81,7 @@ int BSP_Bt_Valve_Ctr(uint8_t *data, uint8_t len)
uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0}; uint8_t mac_addr[FLASH_MAC_INFO_LEN] = {0};
if ((data[0] >= 1) && (data[0] <= 8)) if ((data[0] >= 1) && (data[0] <= 8))
{ {
Flash_Get_Mac_Addr(mac_addr, data[0] - 1); Flash_Get_Mac_Addr(mac_addr, data[0]);
} }
else else
{ {
@ -106,7 +106,7 @@ int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len)
if ((data[0] >= 1) && (data[0] <= 8)) if ((data[0] >= 1) && (data[0] <= 8))
{ {
Flash_Get_Mac_Addr(mac_addr, data[0] - 1); Flash_Get_Mac_Addr(mac_addr, data[0]);
} }
else else
{ {
@ -131,7 +131,7 @@ int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len)
{ {
logDebug("没有数据,全部写入:"); logDebug("没有数据,全部写入:");
logDebug("写入MAC 地址: %02X %02X %02X %02X %02X %02X", data[1], data[2], data[3], data[4], data[5], data[6]); logDebug("写入MAC 地址: %02X %02X %02X %02X %02X %02X", data[1], data[2], data[3], data[4], data[5], data[6]);
if (Flash_Set_Mac_Addr(&data[1], data[0] - 1) != 0) if (Flash_Set_Mac_Addr(&data[1], data[0]) != 0)
{ {
logError("阀门注册写入flash 错误"); logError("阀门注册写入flash 错误");
return 3; return 3;
@ -140,10 +140,10 @@ int BSP_Bt_Register_Valve(uint8_t *data, uint8_t len)
{ {
uint8_t num = Flash_Get_Valve_Num(); uint8_t num = Flash_Get_Valve_Num();
logDebug("num : %02X ", num); logDebug("num : %02X ", num);
Flash_Set_Valve_Num(1); Flash_Set_Valve_Num(num + 1);
logDebug("写入成功,当前阀门数量为: %d", num); logDebug("写入成功,当前阀门数量为: %d", num + 1);
BSP_Bt_Valve_Updata(); // 更新阀门信息 BSP_Bt_Valve_Updata(); // 更新阀门信息
} }
} }
else else
@ -162,7 +162,7 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len)
uint8_t mac_addr[FLASH_MAC_INFO_LEN + 2] = {0}; uint8_t mac_addr[FLASH_MAC_INFO_LEN + 2] = {0};
if ((data[0] >= 1) && (data[0] <= 8))// 判断是否是正确的ID if ((data[0] >= 1) && (data[0] <= 8))// 判断是否是正确的ID
{ {
Flash_Get_Mac_Addr(mac_addr, data[0] - 1); Flash_Get_Mac_Addr(mac_addr, data[0]);
} }
else else
{ {
@ -179,12 +179,19 @@ int BSP_Bt_Remove_Valve(uint8_t *data, uint8_t len)
else else
{ {
tmos_memset(mac_addr, 0xFF, FLASH_MAC_INFO_LEN); tmos_memset(mac_addr, 0xFF, FLASH_MAC_INFO_LEN);
if (Flash_Set_Mac_Addr(mac_addr, data[0] - 1) != 0) // 清空掉对应位置MAC数据 if (Flash_Set_Mac_Addr(mac_addr, data[0]) != 0) // 清空掉对应位置MAC数据
{ {
logError("移除阀门信息失败"); logError("移除阀门信息失败");
logHexDumpAll(data, len); logHexDumpAll(data, len);
return -2; return -2;
} }
uint8_t num = Flash_Get_Valve_Num();
if (Flash_Set_Valve_Num(num - 1) != 0) // 移除一个阀门
{
logError("移除阀门信息失败");
logHexDumpAll(data, len);
return -2;
}
BSP_Bt_Valve_Updata(); BSP_Bt_Valve_Updata();
Master_DisConnect(); Master_DisConnect();
} }
@ -206,21 +213,22 @@ int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len)
} }
if ((data[0] >= 1) && (data[0] <= 8)) if ((data[0] >= 1) && (data[0] <= 8))
{ {
Flash_Get_Mac_Addr(mac_addr, data[0] - 1); Flash_Get_Mac_Addr(mac_addr, data[0]);
} }
else else
{ {
logError("valve id error"); logError("valve id error");
return -2; return -2;
} }
if (tmos_memcmp(&data[7], mac_addr, FLASH_MAC_INFO_LEN) == TRUE) if (tmos_memcmp(&data[1], mac_addr, FLASH_MAC_INFO_LEN) == TRUE)
{ {
logError("已经注册过了"); // 不需要重复写入 logError("已经注册过了"); // 不需要重复写入
return 0; // 说明已经注册过了 return 0; // 说明已经注册过了
} }
else else
{ {
if (Flash_Set_Mac_Addr(&data[7], data[0] - 1) != 0) //新阀门数据在前
if (Flash_Set_Mac_Addr(&data[1], data[0]) != 0)
{ {
logError("阀门注册写入flash 错误"); logError("阀门注册写入flash 错误");
return 3; return 3;
@ -235,6 +243,7 @@ int BSP_Bt_Replace_Valve(uint8_t *data, uint8_t len)
void BSP_Bt_Valve_Updata(void) void BSP_Bt_Valve_Updata(void)
{ {
uint8_t cnt = 0; uint8_t cnt = 0;
__attribute__((aligned(4)))
uint8_t mac[6] = {0}; uint8_t mac[6] = {0};
uint8_t num = Flash_Get_Valve_Num(); uint8_t num = Flash_Get_Valve_Num();
@ -246,12 +255,12 @@ void BSP_Bt_Valve_Updata(void)
tmos_memset(&valve_list, 0, sizeof(valve_data_list_t)); tmos_memset(&valve_list, 0, sizeof(valve_data_list_t));
for (int i = 0; i < MAX_VALVE_NUM; i++) // 这个循环是为了将数据拷贝到valve_list中 并且保证id号和flash对应起来 for (int i = 1; i < MAX_VALVE_NUM; i++) // 这个循环是为了将数据拷贝到valve_list中 并且保证id号和flash对应起来
{ {
if (Flash_Get_Mac_Addr(mac, i) == 0) // 说明有MAC数据 if (Flash_Get_Mac_Addr(mac, i) == 0) // 说明有MAC数据
{ {
tmos_memcpy(valve_list.valve_data[cnt].valve_mac, mac, 6); // 这样做的目的就是读取方便只需要根据flash中读取到的数量进行读取前N个值 tmos_memcpy(valve_list.valve_data[cnt].valve_mac, mac, 6); // 这样做的目的就是读取方便只需要根据flash中读取到的数量进行读取前N个值
valve_list.valve_data[cnt].valve_id = i + 1; valve_list.valve_data[cnt].valve_id = i;
logDebug("updata valve_id: %d, valve_mac: %02X %02X %02X %02X %02X %02X", logDebug("updata valve_id: %d, valve_mac: %02X %02X %02X %02X %02X %02X",
valve_list.valve_data[cnt].valve_id, valve_list.valve_data[cnt].valve_id,
valve_list.valve_data[cnt].valve_mac[0], valve_list.valve_data[cnt].valve_mac[0],