采用串口的休眠唤醒功能(地址唤醒)实现多机串口通信(一主多从)
在从机串口初始化函数中添加
// 从机串口设置
// USART_WakeUpConfig(USART1,USART_WakeUp_AddressMark); //设置串口唤醒方式
// USART_SetAddress(USART1,0x02); //设置串口节点地址
// USART_ReceiverWakeUpCmd(USART1,ENABLE);//检查串口是否处于休眠状态
多个从机串联使用时:串口TX端口只能配置成复用开漏状态;
在从机主循环中添加此判断,根据主机发送的地址进行判断从机串口是否唤醒
//if((USART1->CR1 &((uint16_t)0x0002)) == 0) //CR1串口控制寄存器1其位1:RWU位是判断接收器的工作状态
//{
// ... //在此添加要发给主机的内容
//}
主机串口初始化函数正常配置
如果是库函数自带的串口发送函数进行发送地址则不便于修改
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
故此仿照该函数写出发送地址的专用函数
void USART_SendAddr(USART_TypeDef* USARTx, uint16_t Addr)
{
/* Check the parameters */
assert_param(IS_USART_ALL_PERIPH(USARTx));
Addr |= (uint16_t)0x0180;
USARTx->DR = (Addr & (uint16_t)0x01FF);
}
可在主机主循环中使用按键等进行发送地址数据
case 1: USART_SendData(USART1,++key1_data); break;
case 2: USART_SendAddr(USART1,1);break;
case 3: USART_SendData(USART1,--key1_data);break;
case 4: USART_SendAddr(USART1,2);break;
测试问题:
测试过程中只有两个从机,增加从机数量后不知道效果如何;
地址唤醒中的地址匹配会可能会出现重复
增加一台从机后依旧可以正常运行;
测试中发现主机与从机连接中要加一个232电平转换(之前测试时一直附带着USB TO TTL模块向PC机发数据,今天拿走后才发现) |