STM32F405串口问题,使用官方库函数

2019-07-21 03:31发布


串口配置正常
关键代码如下:
/* UART1配置如下:
      - 字长 = 8 比特
      - 停止位 = 1 比特
      - 校验 = 无
      - 波特率 = 115200 
      - 硬件流控制禁止 (RTS和CTS 信号) */
  huart1.Instance        = USART1;
  huart1.Init.BaudRate   = 115200;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits   = UART_STOPBITS_1;
  huart1.Init.Parity     = UART_PARITY_NONE;
  huart1.Init.HwFlowCtl  = UART_HWCONTROL_NONE;
  huart1.Init.Mode       = UART_MODE_TX_RX;
  
  if(HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
if(HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 2048) != HAL_OK)
  {
    Error_Handler();
  }
Uart1RxReady = RESET;
while(1)
{
/*****************************配置信息解析****************************************/
/*串口1以中断的方式循环接收信息,缓冲尺寸根据实际情况进行设置*/
    if( Uart1RxReady == SET)
   {
      //huart1.State = HAL_UART_STATE_READY;
        if(HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 2048) != HAL_OK)//采用中断接收,接收缓存为2048个字节
        {
            Error_Handler();
         }
         Uart1RxReady = RESET;
    }
    /* 串口1边接收边解析*/
   if(Index != huart1.RxXferSize - huart1.RxXferCount  ) //已接收字节数与已解析字节数不相等,则进行解析
   {
         //  if(HAL_UART_Transmit(&huart1,&aRxBuffer[ Index ], 1,200) != HAL_OK)//自收发,非中断方式发送用于测试
         //{
         //   Error_Handler();
         //}
         if(HAL_UART_Transmit_IT(&huart1,&aRxBuffer[ Index ], 1) != HAL_OK)//自收发,中断方式发送用于测试
           {
                Error_Handler();
           }

        /*
           其他代码等等。。
        */
         if(++Index == huart1.RxXferSize)//解析完缓冲区的最后一个字节,重新回到缓冲区起始位置进行解析
         {
           Index = 0;
          }
   }
}

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *UartHandle)
{
  /* Set transmission flag: trasfer complete*/
if( UartHandle == &huart1)
  {
Uart1TxReady = SET;
}

}
/**
  * @brief  Rx Transfer completed callback
  * @param  UartHandle: UART handle
  * @note   This example shows a simple way to report end of DMA Rx transfer, and 
  *         you can add your own implementation.
  * @retval None
  */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
  /* Set transmission flag: trasfer complete*/
if( UartHandle == &huart1)
  {
    Uart1RxReady = SET;
}
}

问题是这样的:首先,接收是绝对没问题的,但是接收一个发送一个的时候,使用中断方式发送就是不行,可能发一两个字符还可以,发多了后面的就不发了,发送代码用红颜 {MOD}标记了出来。蓝 {MOD}的代码是使用非中断方式发送的,可以,但是不适合我的程序。
我的疑问是,是不是接收采用中断方式,发送就不能采用中断方式?而且串口一旦出问题,怎么复位串口都不好使,如非系统复位。串口的问题整得我头都大了,望各位高手牛人能指点一二啊。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
正点原子
1楼-- · 2019-07-21 06:38
帮顶。。。。。
caosix
2楼-- · 2019-07-21 07:57
 

楼主 可有  【HAL 库】 各个 ‘外设’ 的 完整 例程 ??

或者 【HAL 库】 的 ‘使用说明书’ ?? 希望是 有指导意义的 说明书。

13327286788
3楼-- · 2019-07-21 10:15
回复【3楼】caosix:
---------------------------------
有啊,但例程都比较简单,我也是基于例程改的。
caosix
4楼-- · 2019-07-21 13:46
 精彩回答 2  元偷偷看……
13327286788
5楼-- · 2019-07-21 17:43
回复【5楼】caosix:
------------------------------
可以到STM官方下载,里面自带例程呢
caosix
6楼-- · 2019-07-21 22:33
回复【6楼】13327286788:
---------------------------------
谢谢,,,已经都 下载了 一些 库中 自带的 例程 ==> 毫无 指导意义。。

所以:::才来 请你 推荐。。。

一周热门 更多>