From d3a77da7be3808ce65448dbfa9d43d13ba9e0ecd Mon Sep 17 00:00:00 2001
From: zhyinch <zhyinch@gmail.com>
Date: 星期二, 17 八月 2021 14:58:21 +0800
Subject: [PATCH] 增加基站状态输出,增加map表对比
---
源码/核心板/Src/application/serial_at_cmd_app.c | 252 ++++++++++++++++++++++++++++++++++---------------
1 files changed, 174 insertions(+), 78 deletions(-)
diff --git "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/serial_at_cmd_app.c" "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/serial_at_cmd_app.c"
index e9f99cf..9e306fa 100644
--- "a/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/serial_at_cmd_app.c"
+++ "b/\346\272\220\347\240\201/\346\240\270\345\277\203\346\235\277/Src/application/serial_at_cmd_app.c"
@@ -2,91 +2,187 @@
#include "global_param.h"
#include <string.h>
#include <stdio.h>
+#include "dw_app.h"
+#include "RTC.h"
-uint8_t m_frame_data[MAX_FRAME_LEN] = {0};
-uint8_t m_frame_data_len = 0;
+#define MSG_RW 3
+#define MSG_WTAG 6
+#define MSG_PWTAG 8
+#define MSG_REGTAGRESPONSE 0x0b
-void ParseFrame(void)
+#define CMD_READ 1
+#define CMD_WRITE 2
+#define CMD_REPLY 3
+
+struct pwtag_structure pwtag;
+typedef enum{ UsartReceiveWaitHead0,
+ UsartReceiveWaitHead1,
+ UsartReceiveWaitMsgType,
+ UsartReceiveWaitLength,
+ UsartReceiveWaitCMD,
+ UsartReceiveWaitIndex,
+ UsartReceiveWaitDataLen,
+ UsartReceiveWaitData,
+ UsartReceiveWaitChecksum
+}UsartRecvPackState;
+uint8_t mUsartReceivePack[100] = {0};
+uint8_t send_frame[200];
+void SendConfigConfirm(uint8_t pack_msgtype,uint8_t pack_length)
{
- if(!memcmp(m_frame_data, "SET", 3))
- {
- g_com_map[ALARM_DISTANCE] = (m_frame_data[3]-'0')*1000 + (m_frame_data[4]-'0')*100 + (m_frame_data[5]-'0')*10 + (m_frame_data[6]-'0');
- printf("When distance < %d cm, alarm is on.\n", g_com_map[ALARM_DISTANCE]);
- save_com_map_to_flash();
- }
- else if(!memcmp(m_frame_data, "DEV", 3))
- {
- g_com_map[ALARM_DEV] = m_frame_data[3]-'0';
- printf("Alarm device is %d. \n", g_com_map[ALARM_DEV]);
- save_com_map_to_flash();
- }
- else if(!memcmp(m_frame_data, "ID", 2))
- {
- g_com_map[DEV_ID] = 0;
- for(uint8_t i=2; i < m_frame_data_len; i++)
- {
- if(m_frame_data[i]<58 && m_frame_data[i]>47)
- {
- g_com_map[DEV_ID] = g_com_map[DEV_ID]*10 + m_frame_data[i]- '0';
- }
- else
- {
- printf("Error: Wrong ID.\r\n");
- break;
- }
- }
- printf("set dev id = %d. \r\n", g_com_map[DEV_ID]);
- save_com_map_to_flash();
- }
-}
+ uint16_t checksum = 0;
+ send_frame[0] = 0x55;
+ send_frame[1] = 0xAA;
+ send_frame[2] = 0x09;
+ send_frame[3] = 8;
+ send_frame[4] = pack_msgtype;
+ send_frame[5] = pack_length;
+ checksum = Checksum_u16(&send_frame[2],8);
+ memcpy(&send_frame[10],&checksum,2);
+
+ UART_PushFrame(send_frame, 12);
+}
+void SendAnchorState(uint16_t state)
+{
+ uint16_t checksum = 0;
+ send_frame[0] = 0x55;
+ send_frame[1] = 0xAA;
+ send_frame[2] = 0x10;
+ send_frame[3] = 14;
+ memcpy(&send_frame[4],&dev_id,2);
+ send_frame[6] = state;
+
+
+ checksum = Checksum_u16(&send_frame[2],14);
+ memcpy(&send_frame[16],&checksum,2);
+
+ USART_puts(send_frame, 17);
+}
+void SendComMap(uint8_t data_length, uint8_t index)
+{
+ uint16_t checksum = 0;
+ send_frame[0] = 0x55;
+ send_frame[1] = 0xAA;
+ send_frame[2] = 0x03;
+ send_frame[3] = data_length+5;
+ send_frame[4] = CMD_REPLY;
+ send_frame[5] = index;
+ send_frame[6] = data_length;
+ memcpy(&send_frame[7], &g_com_map[index>>1], data_length);
+
+ checksum = Checksum_u16(&send_frame[2],5+data_length);
+ memcpy(&send_frame[7+data_length],&checksum,2);
+
+ UART_PushFrame(send_frame, data_length+9);
+}
+u8 remotetag_para[30],remotetag_paralen;
+u8 remotesend_state=0;
+uint16_t configremotetagID;
+struct regtag_structure regtag_map;
void UsartParseDataHandler(uint8_t data)
{
- static uint8_t s_usart_state = 0;
- static uint8_t s_data_pos;
+ static UsartRecvPackState usart_receive_state = UsartReceiveWaitHead0;
+ uint16_t checksum = 0;
+ static uint8_t pack_datalen = 0,pack_length = 0,pack_index = 0,pack_msgtype = 0,pack_cmd = CMD_READ;
+ static uint8_t index = 0;
+ uint8_t i;
+
- switch(s_usart_state)
- {
- case 0:
- if(data=='A') s_usart_state= 1;
- break;
-
- case 1:
- if(data=='T') s_usart_state = 2;
- break;
+ if(usart_receive_state == UsartReceiveWaitChecksum) { //若收到校验和包
+ checksum = 0;
+ for(int i = 0; i<pack_length-2; i++) {
+ checksum += mUsartReceivePack[i];
+ }
+ checksum += pack_msgtype;
+ checksum += pack_length;
+
+ if(((data + checksum)&0xff) == 0xFF) //校验通过
+ {
+ switch(pack_msgtype)
+ {
+ case MSG_RW:
+ pack_cmd = mUsartReceivePack[0];
+ pack_index = mUsartReceivePack[1];
+ pack_datalen = mUsartReceivePack[2];
+ switch(pack_cmd)
+ {
+ case CMD_WRITE:
+ //从mUsartReceivePack中读取pack_length长度的字节,放到全局变量中
+ memcpy((uint8_t*)&g_com_map + pack_index, &mUsartReceivePack[3], pack_datalen);
+ memcpy((uint8_t*)&g_com_map2 + pack_index, &mUsartReceivePack[3], pack_datalen);
+ //返回一个error状态
+ //SendComMap(pack_datalen,pack_index);
+ save_com_map_to_flash();
+ delay_ms(100);
+ NVIC_SystemReset();
+ break;
+ case CMD_READ:
+ //read包中data字节,即mUsartReceivePack[0]表示数据长度;
+ //从g_com_data结构体中的第index位置读取长度为mUsartReceivePack[0]的字节,发送出来
+ SendComMap(pack_datalen,pack_index);
+ break;
+ default:
+ break;
+ }
+ break;
+ case MSG_WTAG: //修改标签参数
+ remotesend_state=1;
+ memcpy(&configremotetagID,&mUsartReceivePack[0],2);
+ //configremotetagID = pack_cmd|pack_index<<8;
+ //remotetag_para[0] = mUsartReceivePack[2];
+ remotetag_paralen = mUsartReceivePack[4]+3;
+ memcpy(&remotetag_para[1],&mUsartReceivePack[3],remotetag_paralen);
+ break;
+ case MSG_PWTAG: //批量修改标签参数
+ pwtag.groupnum = mUsartReceivePack[0];
+ pwtag.index = mUsartReceivePack[1];
+ pwtag.remain_time = 5;
+ for(i=0;i<pwtag.groupnum;i++)
+ {
+ memcpy(pwtag.groupid[i],&mUsartReceivePack[i*6+2],4);
+ memcpy(&pwtag.group_interval[i],&mUsartReceivePack[i*6+6],2);
+ }
+ break;
+ case MSG_REGTAGRESPONSE:
+ regtag_map.index++;
+ if(regtag_map.index==MAX_REGTAGNUM)
+ {regtag_map.index = 0;}
+ regtag_map.remain_time[regtag_map.index]=5;
+ memcpy(®tag_map.tagid[regtag_map.index],&mUsartReceivePack[0],2);
+ memcpy(®tag_map.tag_frequency[regtag_map.index],&mUsartReceivePack[2],2);
+ memcpy(®tag_map.tag_slotpos[regtag_map.index],&mUsartReceivePack[4],2);
+ break;
+ }
+ SendConfigConfirm(pack_msgtype,pack_length);
+ }
+ usart_receive_state = UsartReceiveWaitHead0;
+ pack_index = 0;
+ pack_length = 0;
+ index=0;
+ } else if(usart_receive_state == UsartReceiveWaitData) { //若果收到的是正常通讯包
+ mUsartReceivePack[index] = data;
+ index++;
+ if(index == pack_length-2) { //如果收到的index与长度相等
+ usart_receive_state = UsartReceiveWaitChecksum;
+ }
+ } else if(usart_receive_state == UsartReceiveWaitLength) { //收到长度字节
- case 2:
- if(data=='+')
- {
- s_usart_state = 3;
- s_data_pos = 0;
- m_frame_data_len = 0;
- }
- break;
-
- case 3:
- m_frame_data_len = s_data_pos;
- m_frame_data[s_data_pos++] = data;
- if(data == 0x0d)
- {
- s_usart_state = 4;
- }
- if(s_data_pos >= MAX_FRAME_LEN) //如果超过最大长度
- {
- m_frame_data_len = MAX_FRAME_LEN;
- ParseFrame();
- s_usart_state = 0;
- }
- break;
-
- case 4:
- if(data == 0x0a)
- {
- ParseFrame();
- s_usart_state = 0;
- }
- break;
-
- default: break;
+ pack_length = data;
+ pack_index = 0;
+ usart_receive_state = UsartReceiveWaitData;
+
+ } else if((usart_receive_state == UsartReceiveWaitHead0) && (data == 0x55)) { //收到第一个包头
+ usart_receive_state = UsartReceiveWaitHead1;
+ } else if((usart_receive_state == UsartReceiveWaitHead1) && (data == 0xAA)) { //收到第二个包头
+ usart_receive_state = UsartReceiveWaitMsgType;
+ }else if ((usart_receive_state == UsartReceiveWaitMsgType)) {
+ usart_receive_state = UsartReceiveWaitLength;
+ pack_msgtype = data;
}
+ else {
+ usart_receive_state = UsartReceiveWaitHead0;
+ pack_index = 0;
+ pack_length = 0;
+ }
+
}
--
Gitblit v1.9.3