打印
[STM32F2]

stm32f207 RS485通信问题

[复制链接]
1311|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhanghqi|  楼主 | 2019-12-16 23:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
只能连续收发一个字节

使用特权

评论回复
沙发
zhenykun| | 2019-12-16 23:10 | 只看该作者
什么意思?不是很明白你说的什么,能再解释一下这个现象吗

使用特权

评论回复
板凳
zhanghqi|  楼主 | 2019-12-16 23:16 | 只看该作者
发多了接收不到,貌似溢出了,如何处理呢?

使用特权

评论回复
地板
jlyuan| | 2019-12-16 23:19 | 只看该作者
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
5
zhanghqi|  楼主 | 2019-12-16 23:22 | 只看该作者
程序代码如下:#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);
   }
}

使用特权

评论回复
6
zhanghqi|  楼主 | 2019-12-16 23:29 | 只看该作者
一次性发2个字节以上接收回来的是乱码。。。

使用特权

评论回复
7
dengdc| | 2019-12-16 23:32 | 只看该作者
你自己的中断服务的问题.

使用特权

评论回复
8
heweibig| | 2019-12-16 23:35 | 只看该作者
中断服务里搞了几个 delay_ms(1), 那么长时间下来, 第二个字符早收到了

使用特权

评论回复
9
jiahy| | 2019-12-16 23:37 | 只看该作者
这个中断服务怎样写, 参考一下外设库里的例程, 好好动动脑子吧

使用特权

评论回复
10
spark周| | 2019-12-16 23:43 | 只看该作者
看你串口缓存区大小有关了,你设置的一个,就是同时只能发送一个。

使用特权

评论回复
11
liliang9554| | 2019-12-16 23:46 | 只看该作者
中断里搞延时干啥。

使用特权

评论回复
12
wangpe| | 2019-12-16 23:49 | 只看该作者
串口缓存区有多大?

使用特权

评论回复
13
zhuww| | 2019-12-16 23:52 | 只看该作者

参考一下库里的例程,中断里不要放延时

使用特权

评论回复
14
pangb| | 2019-12-16 23:55 | 只看该作者
你的接收代码有问题

使用特权

评论回复
15
yufe| | 2019-12-16 23:58 | 只看该作者

中断服务里友延时??

使用特权

评论回复
16
guoyt| | 2019-12-18 19:05 | 只看该作者
不建议楼主使用这种思路操作两线制RS485,如果硬要改的话,把发送等待的USART_FLAG_TXE改成USART_FLAG_TC,注意等待TC标志之前最好清一下。

使用特权

评论回复
17
yufe| | 2019-12-18 19:10 | 只看该作者
TXE这个标志仅仅是发送寄存器空,并不代表UART不执行发送,你这个程序会导致一个问题,当你while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET); 这条语句执行下去之后,UART开始发送,然后又执行了GPIO_ResetBits(GPIOD,GPIO_Pin_7);这个语句关掉了RS485芯片的发送使能,所以就接收不到正常的数据了。

使用特权

评论回复
18
磨砂| | 2020-1-15 14:10 | 只看该作者
读取完了之后就可以继续接受了啊

使用特权

评论回复
19
晓伍| | 2020-1-15 14:40 | 只看该作者
怎么看到是溢出了呢

使用特权

评论回复
20
八层楼| | 2020-1-15 14:45 | 只看该作者
中断函数太肥了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

852

主题

11757

帖子

5

粉丝