OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3663|回复: 3

谢谢你抽空帮助我 堵这两天了 STM32F746NGH6 非阻塞接收中断问题 图文都有

[复制链接]

23

主题

69

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-1-5
在线时间
50 小时
发表于 2017-1-14 16:11:25 | 显示全部楼层 |阅读模式
10金钱
实现功能:通过485通信,接收中断且得出收到数据的长度,阻塞式通信差不多搞定了(原理还不大清楚,自己把函数挨个试验了一遍,之前没用过HAL库函数写过程序,下面列出我的错误代码,请指正)下面两个代码是主函数主要看while(1)部分,和中断函数  

[mw_shl_code=applescript,true]int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */  //开始都是初始的配置  用cube产生的代码
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_UART7_Init();

  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
                        HAL_UART_Receive_IT(&huart7,buf,5);   //这里主要向片子发数据并让他返回   发送5个数据后  间隔打印一个乱码
  while (1)
  {
        while(HAL_UART_GetState(&huart7)==RESET);   //等待发送结束
        HAL_GPIO_WritePin(GPIOE,DE_Pin, GPIO_PIN_SET);  //拉高DI引脚
        HAL_UART_Transmit(&huart7,UART7_RX_BUF,UART7_RX_STA,1000);
                HAL_GPIO_WritePin(GPIOE,DE_Pin, GPIO_PIN_RESET);  
                HAL_Delay(100);
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

void UART7_IRQHandler(void) //参考教材上的例程,为了读数据到数组,并记录长度
{
  /* USER CODE BEGIN UART7_IRQn 0 */
       
  /* USER CODE END UART7_IRQn 0 */
        uint8_t Res;
        if((__HAL_UART_GET_FLAG(&huart7,UART_FLAG_RXNE)!=RESET))  //如果接收中断
        {
HAL_GPIO_WritePin(GPIOE,RE_Pin, GPIO_PIN_RESET);  //拉低RO
        HAL_UART_Receive(&huart7,&Res,1,1000);
HAL_GPIO_WritePin(GPIOE,RE_Pin, GPIO_PIN_SET);
                if((UART7_RX_STA&0x8000)==0)//
                {
                        if(UART7_RX_STA&0x4000)//
                        {
                                if(Res!=0x0a)UART7_RX_STA=0;//
                                else UART7_RX_STA|=0x8000;        //
                        }
                        else
                        {       
                                if(Res==0x0d)  UART7_RX_STA|=0x4000;
                                else
                                {
                                        UART7_RX_BUF[UART7_RX_STA&0X3FFF]=Res ;
                                        UART7_RX_STA++;
                                        if(UART7_RX_STA>(200-1))UART7_RX_STA=0;//
                                }                 
                        }
                }                    
        }[/mw_shl_code]

总结:因为刚接触F7,之前经验也很不足,对HAL库函数和中断的函数的理解不到位  再次请帮我指点指点  迷途在这3,4天了,也知道原理很重要,正加油补!

rs485连接

rs485连接

琢磨后中断接收只需前两个函数

琢磨后中断接收只需前两个函数
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

42

主题

297

帖子

0

精华

高级会员

Rank: 4

积分
994
金钱
994
注册时间
2016-7-22
在线时间
318 小时
发表于 2017-1-14 16:23:38 | 显示全部楼层
你没有说明问题所在啊?
回复

使用道具 举报

23

主题

69

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-1-5
在线时间
50 小时
 楼主| 发表于 2017-1-16 09:31:25 | 显示全部楼层
hi我歌月徘徊 发表于 2017-1-14 16:23
你没有说明问题所在啊?

好吧,才开始问题都不知道怎么问,一开始看手册来着,扁了半天也迷茫,后来把函数百度一下就找到方向了,目前遇到的问题是  用来计数 收到的数据个数清零了,但是再发给他数据他直接放到先前的数据后面   
回复

使用道具 举报

23

主题

69

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-1-5
在线时间
50 小时
 楼主| 发表于 2017-1-16 09:42:08 | 显示全部楼层
  while (1)
  {          

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
                uart_read(receive_data,&len);  //读收到的数据
       
        uart_send(receive_data,len); //用printf打印receive_data的数据
  }

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart7)  
{  
    uint8_t ret = HAL_OK;  
    /* Set transmission flag: trasfer complete*/   
                do
                {
                                ++RS485_RX_CNT;
        ret = HAL_UART_Receive_IT(huart7,&aRxbuffer[RS485_RX_CNT],1);  //回掉函数每次收一个,另一个Receive_IT在UART初始化里,
//if(HAL_UART_Receive_IT(&huart7,&aRxbuffer[0],1) != HAL_OK)
//        {
//                Error_Handler();
//        }
      //(ret !=HAL_OK)
                }while((*huart7).RxXferCount == 0);
}

void uart_read(uint8_t *buf,uint8_t *len)//将收到的数据放在buf里,计算长度放入len,一边发送时送入
{
        uint8_t rxlen=RS485_RX_CNT+1;
        uint8_t i=0;
        *len=0;
        HAL_Delay(100);     //延时以便等待数据接收 完成
       
        if(rxlen==(RS485_RX_CNT+1)&&rxlen)
        {
                for(i=0;i<rxlen;i++)
                {
                        buf[i]=aRxbuffer[i];
                }
                *len=RS485_RX_CNT+1;
                RS485_RX_CNT=0;    这里清零了
        }
}
串口调试调用watch窗口显示RS485_RX_CNT没清零,第一次发数据给他abc,显示abc,第二次发def,由于RS485_RX_CNT=0这里清零了,按理应该得到def,但是显示的是abcdef ,帮忙看看   希望说清楚了,请谅解
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 04:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表