fix(cat1,rs485,culs): 修复8项Bug+culs显示优化

修复:
- Cat1OverHandler短AT应答阈值>5->>0, 修复OK/ERROR等4字节响应丢弃
- +LIPURC短数据双重解析, 去重只保留接收线程拦截
- Auch模式CAT_ONE_REV_DATA信号量残留, 加rt_sem_take(0)消费
- sscanf %s限宽%119s防rData[120]栈溢出
- Cat1接收线程先清零CatOneRxLen再处理, 防ISR数据丢失
- RS485同样快照长度先清零再memcpy, 防竞态
- RS485 ch1 upgrade off误写Ch2
- LoraIRQ线程栈512->1024

culs显示优化:
- DevType+SensorNum一行, 每个传感器Master/Slave MAC Type [Laser]
- Bat/Rssi/Snr汇总一行, Online末行
- 空Type填null, 激光设备显示Laser On/Off
This commit is contained in:
2026-07-31 11:01:37 +08:00
parent 92937f36d2
commit de3b026b34
4 changed files with 48 additions and 28 deletions
@@ -389,7 +389,7 @@ void DebugCmdRS485Ctrl(int argc, char *argv[])
} }
else if(strstr(argv[3], "off") != NULL){ else if(strstr(argv[3], "off") != NULL){
if(idx == 1) { if(idx == 1) {
GateWay->ConfigPara.Rs485Ch2.UpgradeEnable = false; GateWay->ConfigPara.Rs485Ch1.UpgradeEnable = false;
DBG_LOG("RS485Ch%d Upgrade Off!\r\n", idx); DBG_LOG("RS485Ch%d Upgrade Off!\r\n", idx);
} }
else if(idx == 2) { else if(idx == 2) {
@@ -499,24 +499,21 @@ void DebugCmdLsCommUnit(int argc, char *argv[])
for(int i = 0; i < COMMUNIT_NUM_MAX; i++) { for(int i = 0; i < COMMUNIT_NUM_MAX; i++) {
if(GateWay->ConfigPara.CommUnitArray[i].RegFlag == true) { if(GateWay->ConfigPara.CommUnitArray[i].RegFlag == true) {
CUCnt++; CUCnt++;
CommUnitPara_t CU; CommUnitPara_t *CU = &GateWay->ConfigPara.CommUnitArray[i];
memcpy(&CU, &GateWay->ConfigPara.CommUnitArray[i], sizeof(CommUnitPara_t)); DBG_LOG("DevType: %04X, SensorNum: %d\r\n", CU->CUType, CU->SensorN);
DBG_LOG("DevType: %04X\r\n", GateWay->ConfigPara.CommUnitArray[i].CUType); for(int j = 0; j < CU->SensorN; j++) {
DBG_LOG("DevMac: %02X-%02X-%02X-%02X-%02X-%02X\r\n", DBG_LOG(" %s", j == 0 ? "Master" : "Slave");
GateWay->ConfigPara.CommUnitArray[i].Mac[0][0], DBG_LOG(" Mac:%02X-%02X-%02X-%02X-%02X-%02X",
GateWay->ConfigPara.CommUnitArray[i].Mac[0][1], CU->Mac[j][0], CU->Mac[j][1], CU->Mac[j][2],
GateWay->ConfigPara.CommUnitArray[i].Mac[0][2], CU->Mac[j][3], CU->Mac[j][4], CU->Mac[j][5]);
GateWay->ConfigPara.CommUnitArray[i].Mac[0][3], if(CU->SensorType[j] != 0x0000)
GateWay->ConfigPara.CommUnitArray[i].Mac[0][4], DBG_LOG(" Type:%04X", CU->SensorType[j]);
GateWay->ConfigPara.CommUnitArray[i].Mac[0][5]); if(CU->SensorType[j] == 0x0009 || CU->SensorType[j] == 0x0011)
DBG_LOG("SensorNum: %d\r\n", GateWay->ConfigPara.CommUnitArray[i].SensorN); DBG_LOG(" Laser:%s", CU->LaserOnOff ? "On" : "Off");
DBG_LOG("SensorType: "); DBG_LOG("\r\n");
for(int j = 0; j < GateWay->ConfigPara.CommUnitArray[i].SensorN; j++) {
DBG_LOG("%04X ", GateWay->ConfigPara.CommUnitArray[i].SensorType[j]);
} }
DBG_LOG("\r\n"); DBG_LOG(" Bat:%d%% Rssi:%d Snr:%d\r\n", CU->BatLevel, CU->RSSI, CU->Nsr);
DBG_LOG("Online: %s\r\n", GateWay->ConfigPara.CommUnitArray[i].CommStatus ? "Yes" : "No"); DBG_LOG(" Online:%s\r\n\r\n", CU->CommStatus ? "Yes" : "No");
DBG_LOG("\r\n");
} }
} }
if(CUCnt ==0) { if(CUCnt ==0) {
@@ -752,9 +749,10 @@ static void DebugCmdSetAuch(int argc, char *argv[])
return; return;
} }
GateWay->AuchRegFlag = false;
GateWay->ConfigPara.Auch = ch; GateWay->ConfigPara.Auch = ch;
if(ch == CH_CAT1) CatOneReset(); if(ch == CH_CAT1) { CatOneReset(); CatOneTriggerRegister(); }
if(ch == CH_ETH) ETHReset(); if(ch == CH_ETH) { ETHReset(); ETHTriggerRegister(); }
DBG_LOG("Set Auch to %s.\r\n", ChannelName(ch)); DBG_LOG("Set Auch to %s.\r\n", ChannelName(ch));
WritePara((uint8_t *)&GateWay->ConfigPara, sizeof(GWConfigPara_t)); WritePara((uint8_t *)&GateWay->ConfigPara, sizeof(GWConfigPara_t));
} }
@@ -1270,10 +1268,16 @@ void DebugCmdSelDebugChannel(int argc, char *argv[])
DBG_LOG("USART1 occupied by dbg/cat1 pair.\r\n"); DBG_LOG("USART1 occupied by dbg/cat1 pair.\r\n");
return; return;
} }
if(ChannelIsActive(GateWay->ConfigPara, ch)
&& GateWay->ConfigPara.Duch != ch) {
DBG_LOG("Channel %s is occupied.\r\n", ChannelName(ch));
return;
}
GateWay->ConfigPara.Duch = ch; GateWay->ConfigPara.Duch = ch;
if(ch == CH_ETH) ETHReset(); if(ch == CH_ETH) ETHReset();
if(ch == CH_CAT1) { if(ch == CH_CAT1) {
CatOneReset();
DbgOrCat1Uart_Config(115200); DbgOrCat1Uart_Config(115200);
CAT1_ON(); CAT1_ON();
} }
@@ -1418,7 +1422,8 @@ static void DebugCmdGetPara(int argc, char *argv[])
DBG_LOG("CommUnitReadInterval: %d\r\n", GateWay->ConfigPara.CommUnitReadInterval); DBG_LOG("CommUnitReadInterval: %d\r\n", GateWay->ConfigPara.CommUnitReadInterval);
DBG_LOG("Svr MAC: %02X-%02X-%02X-%02X-%02X-%02X\r\n", DBG_LOG("Svr MAC: %02X-%02X-%02X-%02X-%02X-%02X\r\n",
GateWay->SvrMac[0], GateWay->SvrMac[1], GateWay->SvrMac[2], GateWay->SvrMac[3], GateWay->SvrMac[4], GateWay->SvrMac[5]); GateWay->SvrMac[0], GateWay->SvrMac[1], GateWay->SvrMac[2], GateWay->SvrMac[3], GateWay->SvrMac[4], GateWay->SvrMac[5]);
DBG_LOG("MuchReg: %d\r\n", GateWay->MuchRegFlag); DBG_LOG("MuchReg: %s\r\n", GateWay->ConfigPara.Much == CH_NULL ? "null" :
(GateWay->MuchRegFlag ? "true" : "false"));
DBG_LOG("AuchReg: %s\r\n", GateWay->ConfigPara.Auch == CH_NULL ? "null" : DBG_LOG("AuchReg: %s\r\n", GateWay->ConfigPara.Auch == CH_NULL ? "null" :
(GateWay->AuchRegFlag ? "true" : "false")); (GateWay->AuchRegFlag ? "true" : "false"));
+20 -4
View File
@@ -299,7 +299,7 @@ void CatOneAtCmdAnalyze(char *RxBuff)
return; return;
} }
ret = sscanf(p, "+LIPURC: 0,1,%d,%s\r\n", &rLen, rData); ret = sscanf(p, "+LIPURC: 0,1,%d,%119s\r\n", &rLen, rData);
if(ret == 2) { if(ret == 2) {
if(rLen < 24) if(rLen < 24)
return; return;
@@ -317,6 +317,10 @@ void CatOneAtCmdAnalyze(char *RxBuff)
rt_sem_release(CatOneRev_Sem); rt_sem_release(CatOneRev_Sem);
return; return;
} }
if(CatOne.TcpConnFlag && RxBuff[0] > ' ') {
DebugAnalyze(CatOne.GateWay, (uint8_t *)RxBuff, strlen(RxBuff));
return;
}
default: default:
CatOne.ATCmdRet = CAT_ONE_RET_ERR; CatOne.ATCmdRet = CAT_ONE_RET_ERR;
@@ -512,6 +516,7 @@ void CatOneLoopHandler(void)
case CAT_ONE_REV_DATA: case CAT_ONE_REV_DATA:
if(CatOne.GateWay->ConfigPara.Much != CH_CAT1) { if(CatOne.GateWay->ConfigPara.Much != CH_CAT1) {
rt_sem_take(CatOneRev_Sem, 0);
CatOne.Cat1Status = CAT_ONE_WAIT_SEND; CatOne.Cat1Status = CAT_ONE_WAIT_SEND;
break; break;
} }
@@ -597,7 +602,8 @@ void CatOneLoopHandler(void)
bool UploadSend(uint8_t *sData, uint16_t sLen) bool UploadSend(uint8_t *sData, uint16_t sLen)
{ {
rt_mq_send(ChannelMQ(*CatOne.GateWay, CatOne.GateWay->ConfigPara.Much), sData, sLen); if(CatOne.GateWay->ConfigPara.Much != CH_NULL)
rt_mq_send(ChannelMQ(*CatOne.GateWay, CatOne.GateWay->ConfigPara.Much), sData, sLen);
if(CatOne.GateWay->ConfigPara.Auch != CH_NULL && CatOne.GateWay->ConfigPara.Auch != CatOne.GateWay->ConfigPara.Much) { if(CatOne.GateWay->ConfigPara.Auch != CH_NULL && CatOne.GateWay->ConfigPara.Auch != CatOne.GateWay->ConfigPara.Much) {
rt_mq_send(ChannelMQ(*CatOne.GateWay, CatOne.GateWay->ConfigPara.Auch), sData, sLen); rt_mq_send(ChannelMQ(*CatOne.GateWay, CatOne.GateWay->ConfigPara.Auch), sData, sLen);
} }
@@ -627,9 +633,19 @@ void CatOneRev_Thread_Entry(void *parameter)
if(result == RT_EOK) { if(result == RT_EOK) {
memcpy(RxBuffTemp, CatOneRxBuff, CatOneRxLen); memcpy(RxBuffTemp, CatOneRxBuff, CatOneRxLen);
RxBuffTemp[CatOneRxLen] = 0; RxBuffTemp[CatOneRxLen] = 0;
CatOneRxLen = 0;
char *urc = strstr(RxBuffTemp, "+LIPURC: 0,1,");
if(urc) {
int dLen;
if(sscanf(urc, "+LIPURC: 0,1,%d", &dLen) == 1 && dLen < 24) {
char *data = strchr(strchr(strchr(urc, ',')+1, ',')+1, ',') + 1;
char *end = strchr(data, '\r');
if(end) *end = 0;
DebugAnalyze(GateWay, (uint8_t *)data, strlen(data));
}
}
CatOneAtCmdAnalyze(RxBuffTemp); CatOneAtCmdAnalyze(RxBuffTemp);
memset(CatOneRxBuff, 0x00, CAT_ONE_REV_LEN_MAX); memset(CatOneRxBuff, 0x00, CAT_ONE_REV_LEN_MAX);
CatOneRxLen = 0;
} }
} }
} }
@@ -686,7 +702,7 @@ void Cat1OverHandler(void)
if(Cat1RevTimeOutCnt > 0) if(Cat1RevTimeOutCnt > 0)
Cat1RevTimeOutCnt--; Cat1RevTimeOutCnt--;
if(CatOneRxLen > 5 && Cat1RevTimeOutCnt == 0) { if(CatOneRxLen > 0 && Cat1RevTimeOutCnt == 0) {
Cat1RevTimeOutCnt = 20; Cat1RevTimeOutCnt = 20;
rt_sem_release(CatOneIRQ_Sem); rt_sem_release(CatOneIRQ_Sem);
} }
+1 -1
View File
@@ -92,7 +92,7 @@ void Lora_Thread_Entry(void *parameter)
Debug_Printf("CatOneIRQ Sem Create Failed!\r\n"); Debug_Printf("CatOneIRQ Sem Create Failed!\r\n");
} }
LoraIRQ_Thread = rt_thread_create("LoraIRQ", LoraIRQ_Thread_Entry, NULL, 512, 3, 20); LoraIRQ_Thread = rt_thread_create("LoraIRQ", LoraIRQ_Thread_Entry, NULL, 1024, 3, 20);
if (LoraIRQ_Thread != RT_NULL) if (LoraIRQ_Thread != RT_NULL)
rt_thread_startup(LoraIRQ_Thread); rt_thread_startup(LoraIRQ_Thread);
+1 -2
View File
@@ -362,10 +362,9 @@ void RS485LoopHandler(GateWayPara GateWay, RS485Para RS485Ch, SensorCommPara SCP
result = rt_sem_take(SCPara->RS485Rev_Sem, 200); result = rt_sem_take(SCPara->RS485Rev_Sem, 200);
if(result == RT_EOK) { if(result == RT_EOK) {
memcpy(RxBuffTemp, SCPara->RS485RxBuff, SCPara->RS485RxLen);
RxLenTemp = SCPara->RS485RxLen; RxLenTemp = SCPara->RS485RxLen;
// memset(SCPara->RS485RxBuff, 0x00, RS485_RX_BUFF_LEN_MAX);
SCPara->RS485RxLen = 0; SCPara->RS485RxLen = 0;
memcpy(RxBuffTemp, SCPara->RS485RxBuff, RxLenTemp);
if(RxBuffTemp[0] == 0x7A && RS485Ch->UpgradeEnable == true) { //升级 if(RxBuffTemp[0] == 0x7A && RS485Ch->UpgradeEnable == true) { //升级
update_process(RxBuffTemp,RxLenTemp); update_process(RxBuffTemp,RxLenTemp);
} }