stm32串口通信(232和485)

2019-03-23 19:42发布

232通信时,一个字节一个字节发还可以,但是一旦多个字节一起发,板子最多收到前两个字节,这是怎么回事求指教,
485通信时也是,一个字节没问题,但是多个字节发送的时候就只收的到前面的一个 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
yyup
1楼-- · 2019-03-23 22:55
/ #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);}
xinjitmzy
2楼-- · 2019-03-24 03:19
 精彩回答 2  元偷偷看……
yyup
3楼-- · 2019-03-24 07:14
这是在while(1)这个循环里面,应该接受一个字节就发一个字节嘛,定义的那个buffer能够容下一个字节就够了赛
yyup
4楼-- · 2019-03-24 07:47
这个232的串口,如果用一根usb转串口线来连就能完全就收发送,但是如果直接连在电脑的232串口上板子就只能就收最多两个字节,真奇怪
yyup
5楼-- · 2019-03-24 11:30
 精彩回答 2  元偷偷看……
虚V界
6楼-- · 2019-03-24 12:18
首先一个问题,你为什么定义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);  
         }                      
}

一周热门 更多>