打印

STM32串口多机通信

[复制链接]
306|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
追光少年|  楼主 | 2020-4-20 20:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
采用串口的休眠唤醒功能(地址唤醒)实现多机串口通信(一主多从)
在从机串口初始化函数中添加
// 从机串口设置
//    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机发数据,今天拿走后才发现)

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

379

主题

379

帖子

0

粉丝