ㅤifelse 2023-09-16 12:25 采纳率: 33.3%
浏览 12
已结题

RS485发送数据代码编写

这样写RS485的发送数据可以吗?
我利用了串口的接收中断和空闲中断,当进入空闲中断时u1.rc_flag=1;

void RS485_Sendbyte(u8 data)
{
  while(!u1.falg);         //等待接收完成
  RS485_DE=1;         //控制位置1,进入发送态
  u1.flag=0;                //空闲中断中的标志位清零
  while(!USART_GetFlagStatus(USART1,USART_FLAG_TXE));//等待发送数据寄存器为空
  USART_SendData(USART1,data);
  while(!USART_GetFlagStatus(USART1,USART_FLAG_TC));//等待发送完成
  RS485_DE=0;        //控制位置0,进入接收态
}
  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-09-16 12:41
    关注

    引用 皆我百晓生 小程序回复内容作答:
    这段代码的基本逻辑是正确的,但存在一些不完善的地方。下面是对代码进行改进和说明的建议:

    1. 首先,根据你的描述,u1应该是一个结构体或类的实例,而不是一个变量。所以,应该将!u1.falgu1.flag=0替换为!u1.flagu1.flag=0

    2. 在等待发送数据寄存器为空的地方,可以使用USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET来代替!USART_GetFlagStatus(USART1, USART_FLAG_TXE)。这样可以更清晰地判断是否为空。

    3. 在等待发送完成的地方,可以使用USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET来代替!USART_GetFlagStatus(USART1, USART_FLAG_TC)。同样,这样可以更清晰地判断是否发送完成。

    4. 在每次发送字节之前,应该先等待前一个字节发送完成。可以在while循环中添加这个判断条件USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET

    修改后的代码如下所示:

    void RS485_Sendbyte(u8 data)
    {
      while(!u1.flag);         //等待接收完成
      RS485_DE=1;         //控制位置1,进入发送态
      u1.flag=0;                //空闲中断中的标志位清零
      while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//等待上一个数据发送完成
      while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//等待发送数据寄存器为空
      USART_SendData(USART1, data);
      while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);//等待发送完成
      RS485_DE=0;        //控制位置0,进入接收态
    }
    

    注意,以上代码假设你已经正确地配置了STM32的USART1串口,并且使用了适当的引脚来控制RS485的DE线。如果你还没有做这些配置,需要根据实际情况进行相应的修改。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月17日
  • 已采纳回答 10月9日
  • 创建了问题 9月16日

悬赏问题

  • ¥15 自动回复评论的小插件
  • ¥20 用c++完成两道大题,要求提供.h和.cpp,以及用来测试的main.cpp
  • ¥15 2024电赛H题指导
  • ¥15 第三方如何控制E8a进行烧录
  • ¥15 关于lua调用DLL的c/c++动态库(相关搜索:数据库)
  • ¥15 openwrt结合智能家居(相关搜索:路由器)
  • ¥15 求一款免费的pdf编辑js,web端用的
  • ¥15 求分析下图晶体与三极管组成的振荡电路
  • ¥100 多线程+连接池+代理 运行一段时间线程阻塞
  • ¥15 关于#单片机#的问题:求一个使用C语言将重力加速度gx,gy,gz积分获取到速度的代码(相关搜索:c语言)