[求助] stm32串口通信(232和485)

yyup   2012-7-16 10:57 楼主
232通信时,一个字节一个字节发还可以,但是一旦多个字节一起发,板子最多收到前两个字节,这是怎么回事求指教,
485通信时也是,一个字节没问题,但是多个字节发送的时候就只收的到前面的一个

回复评论 (9)

#include "includes.h"
 u16 USART1_ReceiveData();
void USART1_SendData(u16 buffer);
u16 USART3_ReceiveData();
void USART3_SendData(u16 buffer);
/********************************************************************************************************
* 函 数 名 :  void main(void)
* 描    述 : main
* 输入参数 : None.
* 输出参数 : None.
* 返   回  : None.
********************************************************************************************************/
void main(void)
    u16 i,j,buffer;
    u16 swdata;
    u32 sngtmp;
    
    
    
    //目标板初化,
    Target_Init();   
    /********开机扫描*******/
    USART_Cmd(USART1,ENABLE);
    USART_Cmd(USART3,ENABLE);
    //LED_open();
    
    

    for(i=0;i<30000;i++)
    {
      for(j=1;j<9;j++)
      {
        Hex_test(j,8);
        GPIO_SetBits(GPIOC, HEX_D7);
      } 
    } 
    Hex_close();
    
    
    while(1)
    {
        buffer=USART1_ReceiveData();
        USART1_SendData(buffer);
        if(buffer==0x01)
          Display_LedScan();
        if(buffer==0x02)
        {LED_open();
        Delay_uS(100000);
        LED_close();
        }
    }
    
}

u16 USART1_ReceiveData()
{ //Delay_uS(100);  
  while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);
     return USART_ReceiveData(USART1);
}
void USART1_SendData(u16 buffer)
{ //Delay_uS(100);  
  USART_SendData(USART1,buffer);
   while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}
u16 USART3_ReceiveData()
{ //Delay_uS(100);  
  while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET);
        return USART_ReceiveData(USART3);
}
void USART3_SendData(u16 buffer)
{    // Delay_uS(100);   
  GPIO_SetBits(UART3_GRP, UART3_485_DIR);
        Delay_uS(1000);
     USART_SendData(USART3,buffer);
     while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
        Delay_uS(1000);
     GPIO_ResetBits(UART3_GRP, UART3_485_DIR);
}
点赞  2012-7-16 10:58
每发前两个字节,说明你定义的缓冲区长度是两个字节的长度。。。周而复始的循环
点赞  2012-7-16 11:25
这是在while(1)这个循环里面,应该接受一个字节就发一个字节嘛,定义的那个buffer能够容下一个字节就够了赛
点赞  2012-7-16 13:07
这个232的串口,如果用一根usb转串口线来连就能完全就收发送,但是如果直接连在电脑的232串口上板子就只能就收最多两个字节,真奇怪
点赞  2012-7-16 13:26
今天我又去调试了哈,我专门用三个不同的缓存来收,但是用电脑上的串口还是只能收到前两位,这是什么情况,求那位高手指点哈,感激不尽
点赞  2012-7-16 19:01
首先一个问题,你为什么定义buffer 是u16的呢?USART_DR这个寄存器,你看手册只有9位[8:0];
这里可能会出现数据类型转换的问题,
另外我也做过串口立即收发的确有点问题,串口会死掉。
我串口是做到中断中的,进入中断后就吧中断关掉以免噪声扰乱数据处理
void USART1_IRQHandler(void)
{         
      if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
        {
              USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);          
              Receive_buffer=USART_ReceiveData(USART1);
              USART_Rbuffer[Receive_Count]=Receive_buffer;
          Receive_Count++;
          if(Receive_Count>100) Receive_Count=0;              
              USART_SendData(USART1,Receive_buffer);
              while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);  
      
               USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);  
         }                      
}
点赞  2012-7-17 11:15
我这里用u16,主要是我看这个固件库里这两个函数定义的参量就是u16的
void USART_SendData(USART_TypeDef* USARTx, u16 Data);
u16 USART_ReceiveData(USART_TypeDef* USARTx);
这两个就是我在固件库里看到的

我用的是查询方式,现在在弄的是一个485摄像头,有没有必要用中断来收发呢?
点赞  2012-7-17 11:42
我刚才把u16改成u8(包括库里的函数也改了),再试了哈,还是老样子, 只收得到前两个字节,而且我单独调过,发送是没得问题的,问题就在接收的时候只接收前两个字节,后面的字节不接收而且后面的语句也不执行,但是不是死循环直接调回while(1)那去了。求指教呀!!!
点赞  2012-7-17 13:07
你这个可能是进入了串口中断的,建议考虑下串口中断
点赞  2012-8-1 19:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复