不对,我的意思是把上段代码的主动发送改成被动发送
时间: 2024-04-08 10:29:39 浏览: 20
抱歉,我理解错了你的意思。要将代码修改为被动发送按键状态,你需要使用中断来触发发送操作。下面是修改后的代码:
首先,在主函数中初始化串口和GPIO,并启用相关中断:
```c
int main(void)
{
// 初始化串口和GPIO
// 启用串口接收中断
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
while (1)
{
// 主循环中进行其他操作
}
}
```
然后,在串口接收中断处理函数中,判断是否接收到特定命令,如果接收到命令,则触发按键状态的被动发送:
```c
void USART1_IRQHandler(void)
{
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{
uint8_t command = USART_ReceiveData(USART1);
// 判断接收到的命令
if (command == COMMAND_SEND_KEY_STATUS)
{
Send_Key_Inf();
}
}
}
```
最后,修改`Send_Key_Inf()`函数,使其不再主动发送按键信息,而是将按键信息保存在缓冲区中,等待被动发送触发时再发送出去:
```c
void Send_Key_Inf(void)
{
static uint8_t Txbuf[13]; // 按键信息缓冲区
static uint16_t crc16 = 0; // 校验码
// 构造按键信息数组
Txbuf[0] = SLAVE_ADDRESS; // 装置地址
Txbuf[1] = MOD_WRITE_M_REGISTER; // 写多个寄存器
Txbuf[2] = (uint8_t)(ADR_KEY_START >> 8);
Txbuf[3] = (uint8_t)(ADR_KEY_START);
Txbuf[4] = 0x00;
Txbuf[5] = 0x02;
Txbuf[6] = 0x04;
Txbuf[7] = (uint8_t)(Dealwith.Key1_REG >> 8);
Txbuf[8] = (uint8_t)(Dealwith.Key1_REG);
Txbuf[9] = (uint8_t)(Dealwith.Key2_REG >> 8);
Txbuf[10] = (uint8_t)(Dealwith.Key2_REG);
crc16 = CRC16(Txbuf, 11);
Txbuf[11] = (uint8_t)(crc16);
Txbuf[12] = (uint8_t)(crc16 >> 8);
// 发送数据
DMA_Usart1_Send(Txbuf, 13);
}
```
这样,当接收到特定命令时,`Send_Key_Inf()`函数会被触发,将按键信息发送出去。请根据你的具体需求修改相关的命令和参数。