ifxz0123 发表于 2021-1-8 14:31

HK32F030MF4P6中断发送,中断接收,接收超时中断判断接收完成

本帖最后由 ifxz0123 于 2022-3-28 14:19 编辑

HK32F030MF4P6中断方式发送,可以释放CPU,不用阻塞CPU。
接收中断+接收超时中断,勉强可以代替没DMA的遗憾,并实现不定长度的数据接收。
例程代码,是把串口的接收的数据进行回环发送出去。你发送一串数据后,MCU接收完毕这串数据收再发送出去。
例程代码:

定义了2个结构体变量,方便对接收发送的数据进行管理。
struct USART_IT_TX
{
    uint8_t Buffer;
    uint8_t Len;
    uint8_t Index;
}Usart1_it_tx;


struct USART_IT_RX
{
    uint8_t Buffer;
    uint8_t Len;
    uint8_t Index;
    uint8_t FinishedFlag;
}Usart1_it_rx;



int main(void)
{               
    delay_init();

    Led_Init();

    Usart1_Config();

    /* Infinite loop */
    while (1)
    {   
      if( SET == Usart1_it_rx.FinishedFlag)
      {
            USART1_IT_SendString(Usart1_it_rx.Buffer, Usart1_it_rx.Len);
            Usart1_it_rx.FinishedFlag = RESET;
      }
    }
}

回环压力测试:串口助手每3ms发送24个字节数据(逻辑分析仪测得,发送24个字节需要2.071333ms),MCU接收完24个字节数据后再发回给串口助手。

发送接收回环压力测试,可以看到没有数据丢失





zhifeng 发表于 2021-1-8 19:33

电脑发不了这么快的的3ms 对windosws不可能的

HSXP063 发表于 2021-1-8 21:35

不错, 收藏了

callhgd 发表于 2021-1-9 09:59

不错,谢谢楼主分享。

ifxz0123 发表于 2021-1-13 11:09

本帖最后由 ifxz0123 于 2021-1-13 11:14 编辑

zhifeng 发表于 2021-1-8 19:33
电脑发不了这么快的的3ms 对windosws不可能的
确实是,实测发现设置的3ms,实际上是16ms发送一次。有空,我再重新测试下

两只袜子 发表于 2021-1-14 09:02

很棒,拿走不谢

gddddd 发表于 2021-1-14 16:11

ifxz0123 发表于 2021-1-13 11:09
确实是,实测发现设置的3ms,实际上是16ms发送一次。有空,我再重新测试下 ...

应该只是显示不过来,看串口助手收和发的字节数是对上号的,感觉很棒,果然是硬件不足软件补,减少了没有DMA的遗憾

LM莫 发表于 2021-1-14 17:19

这么快的速度不让别的事情干了吗?有时候确实是软件限制了。

换个地方合格 发表于 2022-8-10 16:23

我在测试的时候发现隔段时间就会产生一次超时中断,然后串口就会把上次接收的数据第一个字节发送出来
16:06:25 收:12 34 56 78 90 12 34 56 78 90 12 34 56 78 90 12
16:06:25 收:12 34 56 78 90 12 34 56 78 90 12 34 56 78 90 12
16:08:53 收:12
16:11:22 收:12
16:13:50 收:12
16:16:18 收:12
16:18:46 收:12

ifxz0123 发表于 2022-8-11 08:38

换个地方合格 发表于 2022-8-10 16:23
我在测试的时候发现隔段时间就会产生一次超时中断,然后串口就会把上次接收的数据第一个字节发送出来
16:06 ...

通过你的描述,我还无法定位问题出在哪里。需要借助逻辑分析仪,从时序上去判断在哪一块出了问题

换个地方合格 发表于 2022-8-11 15:01

ifxz0123 发表于 2022-8-11 08:38
通过你的描述,我还无法定位问题出在哪里。需要借助逻辑分析仪,从时序上去判断在哪一块出了问题 ...

应该是接收数据线上偶尔有个电平变化,产生了一个起始位,这样就会触发超时中断,但是因为不是有效数据,不会触发接收中断,接收缓冲区中的数据不会改变,就会出现这个现象。应该在接收超时中断中判断是否接收到有效数据。
    if( USART_GetITStatus(USART1, USART_IT_RTO) != RESET )   // 接收超时中断
    {
                if(Usart1_it_rx.Index)
                {
                        Usart1_it_rx.FinishedFlag = SET;
                        Usart1_it_rx.Len = Usart1_it_rx.Index;
                        Usart1_it_rx.Index = 0;
                }
      USART_ClearITPendingBit(USART1, USART_IT_RTO);
    }
实测加上判断后就不会出现这个问题

Yao9520 发表于 2024-7-4 21:54

感谢,感谢分享 感谢大佬
页: [1]
查看完整版本: HK32F030MF4P6中断发送,中断接收,接收超时中断判断接收完成