[STM32F2] stm32f207 RS485通信问题

[复制链接]
1239|24
 楼主| zhanghqi 发表于 2021-12-9 21:33 | 显示全部楼层 |阅读模式
只能连续收发一个字节
zwll 发表于 2021-12-9 21:35 | 显示全部楼层
什么意思?不是很明白你说的什么,能再解释一下这个现象吗
 楼主| zhanghqi 发表于 2021-12-9 21:37 | 显示全部楼层
发多了接收不到,貌似溢出了,如何处理呢?
jlyuan 发表于 2021-12-9 21:39 | 显示全部楼层
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因
 楼主| zhanghqi 发表于 2021-12-9 21:43 | 显示全部楼层
程序代码如下:#include "pbdata.h"
//#include "stdio.h"

void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void USART_Configuration(void);
uint32_t uartreceive;

int main(void)
{
   RCC_Configuration();         //ϵͳʱÖÓ³õʼ»¯
   GPIO_Configuration(); //¶Ë¿Ú³õʼ»¯
   USART_Configuration();//´®¿Ú³õʼ»¯
   NVIC_Configuration(); //Öжϳõʼ»¯
         
         GPIO_ResetBits(GPIOD,GPIO_Pin_7);
   while(1);
}

void RCC_Configuration(void)
{
        SystemInit();
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
}

void GPIO_Configuration(void)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
        
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_USART2);
  GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_USART2);
        GPIO_PinAFConfig(GPIOD, GPIO_PinSource7, GPIO_AF_USART2);
        
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//TX ¸´ÓÃÍÆÍìÊä³ö
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOD, &GPIO_InitStructure);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//RX ¸¡¿ÕÊäÈë
  //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOD,&GPIO_InitStructure);
        
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;//485_CS ÍÆÍìÊä³ö
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
        GPIO_Init(GPIOD,&GPIO_InitStructure);
}

void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}

void USART_Configuration(void)
{
        USART_InitTypeDef  USART_InitStructure;

        USART_InitStructure.USART_BaudRate = 9600;
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;
        USART_InitStructure.USART_StopBits = USART_StopBits_1;
        USART_InitStructure.USART_Parity = USART_Parity_No;
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        USART_InitStructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;

        USART_Init(USART2,&USART_InitStructure);

  USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
        USART_Cmd(USART2,ENABLE);
        USART_ClearFlag(USART2,USART_FLAG_TC);
}

中断处理如下:
void USART2_IRQHandler(void)
{
         uartreceive = 0;
   if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
   {
                 
                static int k = 0;
//  uartreceive=USART_ReceiveData(USART2);
                uartreceive=USART2->DR;
                 
                GPIO_SetBits(GPIOD,GPIO_Pin_7);
                delay_ms(1);
                 
                //USART_ClearITPendingBit(USART2, USART_IT_RXNE);
                //USART_ClearFlag(USART2, USART_FLAG_RXNE);
                 
                USART_SendData(USART2,uartreceive);
                while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);
                delay_ms(1);
                delay_ms(1);
                GPIO_ResetBits(GPIOD,GPIO_Pin_7);
   }
}
 楼主| zhanghqi 发表于 2021-12-9 21:45 | 显示全部楼层
一次性发2个字节以上接收回来的是乱码。。。
dengdc 发表于 2021-12-9 21:47 | 显示全部楼层
你自己的中断服务的问题.
heweibig 发表于 2021-12-9 21:49 | 显示全部楼层
中断服务里搞了几个 delay_ms(1), 那么长时间下来, 第二个字符早收到了
jiahy 发表于 2021-12-9 21:52 | 显示全部楼层
这个中断服务怎样写, 参考一下外设库里的例程, 好好动动脑子吧
spark周 发表于 2021-12-9 21:55 | 显示全部楼层
看你串口缓存区大小有关了,你设置的一个,就是同时只能发送一个。
liliang9554 发表于 2021-12-9 21:56 | 显示全部楼层
中断里搞延时干啥。
dengdc 发表于 2021-12-9 21:59 | 显示全部楼层
串口缓存区有多大?
wyjie 发表于 2021-12-9 22:01 | 显示全部楼层
参考一下库里的例程,中断里不要放延时
zwll 发表于 2021-12-9 22:03 | 显示全部楼层
你的接收代码有问题
dengdc 发表于 2021-12-9 22:08 | 显示全部楼层
中断服务里友延时??
heweibig 发表于 2021-12-9 22:10 | 显示全部楼层
不建议楼主使用这种思路操作两线制RS485,如果硬要改的话,把发送等待的USART_FLAG_TXE改成USART_FLAG_TC,注意等待TC标志之前最好清一下。
shimx 发表于 2021-12-9 22:11 | 显示全部楼层
TXE这个标志仅仅是发送寄存器空,并不代表UART不执行发送,你这个程序会导致一个问题,当你while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET); 这条语句执行下去之后,UART开始发送,然后又执行了GPIO_ResetBits(GPIOD,GPIO_Pin_7);这个语句关掉了RS485芯片的发送使能,所以就接收不到正常的数据了。
liliang9554 发表于 2021-12-9 22:13 | 显示全部楼层
读取完了之后就可以继续接受了啊
zhanglli 发表于 2021-12-9 22:14 | 显示全部楼层
怎么看到是溢出了呢
stly 发表于 2021-12-9 22:17 | 显示全部楼层
中断函数太肥了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

852

主题

11757

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部