野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 830|回复: 2

STM32串口多机通信

[复制链接]
发表于 2019-8-5 08:45:20 | 显示全部楼层 |阅读模式
采用串口的休眠唤醒功能(地址唤醒)实现多机串口通信(一主多从)
在从机串口初始化函数中添加
// 从机串口设置
//    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机发数据,今天拿走后才发现)

组网.zip

734.22 KB, 下载次数: 23

回复

使用道具 举报

发表于 2019-8-5 09:54:28 | 显示全部楼层
建议使用485,我做过项目是使用485+MODBUS协议的 ,一主带12从
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-6 14:12:09 | 显示全部楼层
qq877655773 发表于 2019-8-5 09:54
建议使用485,我做过项目是使用485+MODBUS协议的 ,一主带12从

谢谢建议,这是当初上课的时候老师提出来的一个想法。我只是做了初步实现,并没有继续写下去。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|站点地图|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号-2 ) 大学生ARM嵌入式2群

GMT+8, 2020-8-12 00:51 , Processed in 0.135486 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表