调试key LCD rs485都正常运行,修复了bug,但是DMA接收的问题没有解决

This commit is contained in:
2026-01-26 15:48:15 +08:00
parent 2b93c00a16
commit f9f0016f69
14 changed files with 1600 additions and 3523 deletions

View File

@@ -36,9 +36,9 @@
/* ============================================================================
* 轮询与超时常量
* ============================================================================ */
#define RS485_RT_COUNT_MAX (55) /**< 实时轮询计数上限,约 275ms55×5ms */
#define RS485_ACK_COUNT_MAX (40) /**< 应答超时计数上限,约 200ms40×5ms */
#define RS485_ACK_OVERTIME_MAX (5) /**< 连续应答超时次数上限,超过则重初始化 RS485 */
#define RS485_RT_COUNT_MAX (55) /**< 实时轮询计数上限,约 275ms55×5ms */
#define RS485_ACK_COUNT_MAX (40) /**< 应答超时计数上限,约 200ms40×5ms */
#define RS485_ACK_OVERTIME_MAX (5) /**< 连续应答超时次数上限,超过则重初始化 RS485 */
/* ============================================================================
* 数据结构定义
@@ -256,40 +256,34 @@ void NL_LOGO_Printf(void)
* 2. 其他图片
* @retval 无
*/
uint8_t RS485_Process(KEY_TYPE key, uint8_t flag)
void RS485_Process(KEY_TYPE key)
{
static KEY_TYPE key_bk = KEY_NONE; /* 按键备份(静态变量,保持状态) */
static uint8_t LED_BUFF[4]; /* LED状态缓冲区静态变量 */
static uint8_t info[8]; /* 命令信息缓冲区(静态变量) */
static uint32_t CRC_ERR_COUNT = 0; /* CRC错误计数静态变量 */
uint8_t ConnectFlg = flag;
/* 按键处理:保存按键值 */
if(key != KEY_NONE)
{
if(key_bk != key) /* 按键值变化时更新备份 */
{
key_bk = key;
}
key_bk = key;
}
if(RS485REG.NewMessageFlag) /* 接收到新消息 */
{
RS485REG.NewMessageFlag = RESET; /* 清除控制字 */
ConnectFlg = 1; /* 设置连接标志 */
if(Check_CRC((uint8_t*)&RS485REG.DR[0], UART_RX_LEN) == TRUE) /* CRC校验通过 */
{
CRC_ERR_COUNT = 0; /* 重置CRC错误计数 */
memcpy(Picture, (uint8_t*)RS485REG.DR, 3200); /* 提取图片数据前3200字节 */
memcpy(Picture, (uint8_t*)RS485REG.DR, 3200); /* 提取图片数据前3200字节 */
memcpy(info, (uint8_t*)RS485REG.DR + 3200, 8); /* 提取命令信息后8字节 */
if(info[4] == 0x89 && info[5] == 0x45) /* LOGO图片命令特殊标识 */
if(info[4] == 0x89 && info[5] == 0x45) /* LOGO图片命令特殊标识 */
{
memcpy(logo.bmpdata, Picture, 3200); /* 复制图片到LOGO结构体 */
memcpy(logo.bmpdata, Picture, 3200); /* 复制图片到LOGO结构体 */
logo.biWidth = info[0] << 8 | info[1]; /* 解析图片宽度高字节左移8位 + 低字节) */
logo.biHeight = info[2] << 8 | info[3]; /* 解析图片高度高字节左移8位 + 低字节) */
BMP_SAVE2False(); /* 保存 BMP 图片到 Flash */
BMP_SAVE2False(); /* 保存 BMP 图片到 Flash */
/* 显示LOGO */
BackLight_ON(); /* 开启背光 */
@@ -309,11 +303,14 @@ uint8_t RS485_Process(KEY_TYPE key, uint8_t flag)
}
else /* CRC校验失败 */
{
CRC_ERR_COUNT++; /* CRC错误计数递增 */
CRC_ERR_COUNT++; /* CRC错误计数递增 */
if(CRC_ERR_COUNT >= 3) /* 连续3次CRC错误 */
{
/* 接收错位,重新初始化接收 */
RS485_DMA_init(); /* 重新初始化*/
// RS485_DMA_DeInit();
// delay_ms(500);
// delay_ms(500);
// RS485_DMA_init(); /* 重新初始化*/
CRC_ERR_COUNT = 0; /* 重置CRC错误计数 */
}
}
@@ -337,7 +334,6 @@ uint8_t RS485_Process(KEY_TYPE key, uint8_t flag)
if(RS485POLL.RT_count > RS485_RT_COUNT_MAX) /* 定时到*/
{
RefreshScreen(RT_CMD, key_bk); /* 发送实时刷新命令 */
key_bk = KEY_NONE; /* 清除按键备份 */
}
}
@@ -352,12 +348,9 @@ uint8_t RS485_Process(KEY_TYPE key, uint8_t flag)
/* 连续超时处理:应答超时次数达到上限 */
if((RS485POLL.ACK_OverTimeCnt >= RS485_ACK_OVERTIME_MAX)) /* 连续超时次数达到上限 */
{
ConnectFlg = 0;
RS485POLL.ACK_OverTimeCnt = RS485_ACK_OVERTIME_MAX; /* 限制最大计数(防止溢出) */
RS485_DMA_init(); /* 重新初始化RS485 */
RS485POLL.ACK_OverTimeCnt = RS485_ACK_OVERTIME_MAX; /* 限制最大计数(防止溢出) */
RS485POLL.CMD_ACK = SET; /* 设置命令应答标志(允许重新发送) */
}
return ConnectFlg;
}
/**