OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3518|回复: 3

STM32串口多机通信

[复制链接]

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2017-7-28
在线时间
28 小时
发表于 2018-11-29 12:57:12 | 显示全部楼层 |阅读模式
采用串口的休眠唤醒功能(地址唤醒)实现多机串口通信(一主多从)
在从机串口初始化函数中添加
// 从机串口设置
//    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;

测试问题:
测试过程中只有两个从机,增加从机数量后不知道效果如何;
地址唤醒中的地址匹配会可能会出现重复


组网.zip

734.07 KB, 下载次数: 324

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
148
金钱
148
注册时间
2017-7-28
在线时间
28 小时
 楼主| 发表于 2018-11-30 16:27:15 | 显示全部楼层
2018/11/30:
增加一台从机后依旧可以正常运行;
测试中发现主机与从机连接中要加一个232电平转换(之前测试时一直附带着USB TO TTL模块向PC机发数据,今天拿走后才发现)
回复 支持 反对

使用道具 举报

0

主题

15

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1019
金钱
1019
注册时间
2017-8-13
在线时间
88 小时
发表于 2019-1-19 14:18:28 | 显示全部楼层
感谢分享。
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2019-1-21
在线时间
0 小时
发表于 2019-1-21 21:16:44 | 显示全部楼层
楼主写的不错
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-21 18:21

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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