先说一下软硬件:

硬件:主控stm32c8t6、485芯片为隔离型芯片ADM2483,调试工具是usb转485接到PC端。

软件:采用库函数开发,开发工具为IAR 7.10,485接的是stm32的串口1(收发都是用中断方式),半双工模式, 协议是MODBUS RTU。

先说明本人是菜鸟,在不断得学习中,欢迎指出错误。

最近在调试RS485时发现一个问题,如果在串口初始化时就使能了发送中断和接收的话,那么在发送一个字节后就会自动进入接收中断。可能是收发的机制没有定好,所以后面采用的方式是在初始化时使能了接收中断,关闭发送中断,在需要发送数据的时候再开启发送中断,发送的时候关闭接收中断,发送完一帧再使能接收中断。这样就可以完整地发送一帧数据出去了。

但是随之而来的问题就是,板子没有接收到数据的时候也会进入接收中断,通常是00、F0、C0、FE、80这样的数据,让我觉得很奇怪,心想是不是串口工具有干扰,于是我就把串口工具拔了,结果还是会进入接收中断,收到的数据还是之前那些。初步判定是硬件问题,因为硬件是之前的同事留下的,所以硬件我也不清楚能不能用;在查阅了许多网友的问题后,有一点给我提示了,就是“485电路的接收端是否有上拉电阻,如果没有,你配置成上拉输入就可以了” 我看了一下板子,是没有接上拉电阻的,而我在初始化的时候设置接收端的模式为 “浮空输入”,按照网友的想法,把输入模式修改为“上拉输入”GPIOInit.GPIO_Mode = GPIO_Mode_IPU 问题果然解决了。

总结:在调试485的时候,即使没有收到数据也会进入接收中断,如果硬件方面板子的485接收端有上拉电阻,那么端口初始化接收端可以设置为浮空输入,如果没有上拉电阻,那么端口初始化时就要设置为上拉输入。

贴上初始化的代码,希望能帮到有需要的人:

//*******************************************************************

//作用:RS485初始化

//参数:BPS-波特率

//StopBit-停止位,1为1位,2为2位

//Parity-校验方式,0为无校验,1为寄校验,2为偶校验

//返回:无

//*******************************************************************

voidRS485Init(Uint32BPS,Uint8StopBit,Uint8Parity)

{

GPIO_InitTypeDefGPIOInit;

USART_InitTypeDefUSARTInit;

NVIC_InitTypeDefNVICInit;

//初始化485使能脚

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);

GPIOInit.GPIO_Pin=GPIO_Pin_15;

GPIOInit.GPIO_Speed=GPIO_Speed_50MHz;

GPIOInit.GPIO_Mode=GPIO_Mode_Out_PP;

GPIO_Init(GPIOB,&GPIOInit);

//初始化USART1中断优先级

NVICInit.NVIC_IRQChannel=USART1_IRQn;

NVICInit.NVIC_IRQChannelPreemptionPriority=1;

NVICInit.NVIC_IRQChannelSubPriority=1;

NVICInit.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVICInit);

//初始化USART1管脚

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

GPIOInit.GPIO_Pin=GPIO_Pin_9;

GPIOInit.GPIO_Speed=GPIO_Speed_50MHz;

GPIOInit.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_Init(GPIOA,&GPIOInit);

GPIOInit.GPIO_Pin=GPIO_Pin_10;

GPIOInit.GPIO_Speed=GPIO_Speed_50MHz;

//GPIOInit.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIOInit.GPIO_Mode=GPIO_Mode_IPU;//此处设为上拉输入

GPIO_Init(GPIOA,&GPIOInit);

//初始化USART1参数

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);

USARTInit.USART_BaudRate=BPS;

if(StopBit==1)

{

USARTInit.USART_StopBits=USART_StopBits_1;

}

else

{

USARTInit.USART_StopBits=USART_StopBits_2;

}

if(Parity==0)

{

USARTInit.USART_WordLength=USART_WordLength_8b;

USARTInit.USART_Parity=USART_Parity_No;

}

elseif(Parity==1)

{

USARTInit.USART_WordLength=USART_WordLength_9b;

USARTInit.USART_Parity=USART_Parity_Odd;

}

else

{

USARTInit.USART_WordLength=USART_WordLength_9b;

USARTInit.USART_Parity=USART_Parity_Even;

}

USARTInit.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;

USARTInit.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

USART_Init(USART1,&USARTInit);

USART_ITConfig(USART1,USART_IT_TC,DISABLE);

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

USART_Cmd(USART1,ENABLE);

USART_ClearFlag(USART1,USART_FLAG_TC);

RS485RXEn();//接收使能,根据485芯片设置:高电平则发送使能,低电平则接收使能

}

rs485接收中断函数使能_关于STM32串口调试RS485时自动进入接收中断相关推荐

  1. STM32串口调试 出现Symbol XXX multiply defined (by uart.o and main.o). ERRO:L6200E

    (STM32串口调试 出现Symbol XXX multiply defined (by uart.o and main.o).) 关于Symbol XXX multiply defined (by ...

  2. 变频器怎么设置_如何利用串口调试软件与变频器通信?

     西门子博途的全套视频教程下载!  西门子S7-1500内部培训PPT下载! 每一个做工控的都必须要会利用串口调试软件来和我们的外围设备来做通讯测试.今天我们就来学习怎么用串口调试软件控制台达的这款变 ...

  3. stm32 串口2空闲中断死机_关于STM32串口空闲中断IDEL的问题

    *****重要*******转载请注明出处*********** 1.空闲中断是接受数据后出现一个byte的高电平(空闲)状态,就会触发空闲中断.并不是空闲就会一直中断,准确的说应该是上升沿(停止位) ...

  4. # 项目一:‍‍‍STM32+串口DMA+RS485+MODBUS+传感器实现SO2的测试

    ✨简介: 通过STM32控制传感器实现气体浓度的测量:RS485+MODBUS+串口DMA+定时器. 其中,USART2负责控制数据的发送和接受,USART3负责将询问帧.应答帧以及处理后数据打印出来 ...

  5. rs485与modbus流程图_基于Modbus协议的RS485总线通讯机设计原理及应用

    摘要:该文详细论述了基于Modbus协议的RS485总线通讯机设计原理及应用.物理结构上包括上位机.主站.和多个从站节点.在上位机与各从站节点间增加主站,承担上位机的轮询工作,使上位机从繁忙的通信工作 ...

  6. STM32串口调试,调试助手没有打印信息?

    如果你是通过重定向,然后调用printf();.记得在魔术棒那里勾选Microlib!!! 后来发现即使不是用printf();函数,使用库函数里面的void USART_SendData(USART ...

  7. excel怎么设置打印区域_用offset函数设置打印区域(有新增内容时自动扩展)

    步骤如下: 1.选择区域 - 页面布局 - 设置打印区域 2.公式 - 名称管理器,找到print_area,然后点击编辑,在引用位置输入以下公式: =OFFSET(自动调整打印区域!$B$1,,,C ...

  8. java 生成缩略图并返回字节数组_关于提取后台图片数据时自动生成缩略图程序...

    调用图片的页面: require_once('thumbs.php');//调用缩略图的类文件 //3 手机推荐 $nestedRows= $Download->getDownotherList ...

  9. mysql创立不了数据库_以下不属于MySQL安装时自动创建的数据库是( ) (5.0分)_学小易找答案...

    [单选题]下列删除itcast数据库的sql语句中,正确的是 (5.0分) [单选题]MySQL提供的( )语句可查看数据表的创建语句. (5.0分) [单选题]下面选项中,属于定点数的类型是 (5. ...

最新文章

  1. Python培训基础教程都教哪些
  2. R可视化ggplot2绘制重叠密度图(Overlay Density Plots)
  3. Linux系统的目录绑定配置
  4. 12个python超强学习网站!加python书籍推荐!( 入门python自学推荐!建议收藏!)
  5. C#开发VS LUA开发
  6. android弹出输入框不影响布局,android 输入法弹出后,不影响activity原有布局
  7. 十三、开多线程,咱们一起来斗图
  8. java容器类继承_JAVA容器 - weslie - OSCHINA - 中文开源技术交流社区
  9. 解决:VS中进行Qt开发,编译时报错:打不开QWidgets.h等文件的问题
  10. java 队列_百战程序员:Java并发阻塞队列
  11. tomcat 发布到服务器启动不了
  12. 火狐浏览器插件学习01
  13. AR技术在智慧交通中的应用
  14. 基于opencv-python的车道线检测(高级)
  15. jmeter第21讲 阿里云下载安装JDK并配置环境变量
  16. 金弘同创:拼多多怎么退保证金
  17. 关于翻译的两篇好文章
  18. 知名大学通报涉嫌造假论文调查结果
  19. [转]去哪儿网机票搜索系统的高并发架构设计
  20. MySQL事务的隔离级别

热门文章

  1. 美团弹性伸缩系统的技术演进与落地实践
  2. scp传文件 文件名有空格解决方法
  3. 年度全球区块链最有影响力人物排行榜TOP10
  4. JAVA构造器及对象创建的过程
  5. 自定义TTF多语言版本之台湾繁体
  6. 【论文阅读】SIF:一种简单有效句子编码方法
  7. Input和label
  8. 防抖与节流(鼠标移入事件每隔一段时间执行)
  9. python Lambda表达式和嵌套if-else
  10. 【四二学堂】java接收邮件,下载附件,并标记为已读