硬汉嵌入式论坛

 找回密码
 立即注册
查看: 8283|回复: 6
收起左侧

[有问必答] RS485自动收发不进接收中断

[复制链接]

32

主题

115

回帖

211

积分

高级会员

积分
211
发表于 2021-4-22 16:20:29 | 显示全部楼层 |阅读模式
电路采用RS485自动收发,不用切换输入输出,可以像串口一样接收
rs.png
发送字符,字符串都是正常的,代码如下:
  1. /*485电路是自动收发,可以和普通232一样*/
  2. void RS4852_SendByte(u8 byte)
  3. {
  4.         USART_SendData(USART2, (u8) byte);
  5.         while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET){}
  6. }
  7. void RS4852_SendStr(uint8_t* aTxBuff,uint16_t uhTxCNT)
  8. {
  9.         u16 i=0;
  10.         while(*(aTxBuff+i)!=0 && i<uhTxCNT)
  11.         {
  12.                 RS4852_SendByte( *(aTxBuff+i) );
  13.                 i++;
  14.         }
  15.         while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET){}
  16. }
复制代码
然后想写一个和普通串口一样的中断接收回显,我在RS232上试过没问题的,代码如下
  1.         NVIC_RS4852_Cfg();
  2.         RS4852_USART2_Cfg();
  3.         USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
复制代码

在RS485上就有问题,中断服务函数如下,进入中断,把接收到的保存起来,然后通过串口再发送出去,:
  1. void USART2_IRQHandler(void)
  2. {
  3.         u8 ubRx = 0;
  4.        
  5.         if(USART_GetITStatus( USART2, USART_IT_RXNE) != RESET)
  6.         {
  7.                
  8.                 ubRx = USART_ReceiveData(USART2);
  9.                 RS4852_SendByte(ubRx);
  10.                 cnt++;
  11.         }
  12.         USART_ClearITPendingBit(USART2, USART_IT_RXNE);
  13. }
复制代码
结果如下,RS485发不出来
rs2.png
中断服务函数的cnt是用来记录进入中断的次数,因为接收到一个字符,进一次中断,最终cnt=16,和接收到的数据一样,但是为啥发不出来呢?谢谢。


回复

使用道具 举报

32

主题

115

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2021-4-22 16:36:04 | 显示全部楼层
我修改了一下,加了定长的数组,记录数据长度,数据接收完毕的标志位,在接收中断里接收数据,然后保存在数组里,接收完毕,在while 死循环中判断标志位来输出
添加的三个全局变量
  1. u8 RxCnt =0;
  2. u8 Rx4852Buff[10] = {0};
  3. u8 Rx4852Flag = 0;
复制代码

中断服务函数
  1. void USART2_IRQHandler(void)
  2. {
  3.         u8 ubRx = 0;
  4.        
  5.         if(USART_GetITStatus( USART2, USART_IT_RXNE) != RESET)
  6.         {
  7.                
  8.                 ubRx = USART_ReceiveData(USART2);
  9.                 Rx4852Buff[RxCnt++] = ubRx;
  10.                 //RS4852_SendByte(ubRx);
  11.                 if(RxCnt >=10)
  12.                 {
  13.                         Rx4852Flag =1;
  14.                 }
  15.         }
  16.         USART_ClearITPendingBit(USART2, USART_IT_RXNE);
  17. }
复制代码

while1中的代码
  1. while(1)
  2.         {       
  3.                 if(Rx4852Flag == 1)
  4.                 {
  5.                         RS4852_SendStr(Rx4852Buff,10);
  6.                         Rx4852Flag = 0;
  7.                         RxCnt = 0;
  8.                 }
  9.         }
复制代码

现在可以发送出来的,但是发几次就会有乱码,如图,图片发不出来。。。。
为什么会有乱码,是这样的发送函数有问题吗?void RS4852_SendStr(uint8_t* aTxBuff,uint16_t uhTxCNT)
为什么接到就发发不出来,非得保存在数组里才能发出来呢?谢谢这个忘了弄悬赏了

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2021-4-23 08:46:38 | 显示全部楼层
感觉你应该先排查硬件问题,最后再排查软件。你再做个这种电路,两个电路对接,一端的RX和TX短接,做个自收发,批量测试看看正常不
回复

使用道具 举报

32

主题

115

回帖

211

积分

高级会员

积分
211
 楼主| 发表于 2021-4-23 08:59:41 | 显示全部楼层
eric2013 发表于 2021-4-23 08:46
感觉你应该先排查硬件问题,最后再排查软件。你再做个这种电路,两个电路对接,一端的RX和TX短接,做个自收 ...

就是两路485  a接a  b接b,然后它们两个互相收发呗
回复

使用道具 举报

20

主题

122

回帖

182

积分

初级会员

积分
182
发表于 2021-4-23 09:45:11 | 显示全部楼层
硬件问题,R65和R71的电阻改10K试试。线路长的话,在A和B之间加120R电阻。
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2021-4-23 15:03:43 | 显示全部楼层
发送前先将USART_IT_RXNE中断关掉, 等发送完成后再开启USART_IT_RXNE中断试试
回复

使用道具 举报

0

主题

12

回帖

12

积分

新手上路

积分
12
发表于 2021-4-25 21:17:38 | 显示全部楼层
先排查硬件,用逻辑分析仪或示波器,检查485芯片的RO脚是否有正常的数据波形。确认无误,再去检查软件问题。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-16 15:09 , Processed in 0.043623 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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