打印
[技术文档]

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

[复制链接]
7818|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 ifxz0123 于 2022-3-28 14:19 编辑

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

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


struct USART_IT_RX
{
    uint8_t Buffer[256];
    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 | 只看该作者
不错,谢谢楼主分享。

使用特权

评论回复
5
ifxz0123|  楼主 | 2021-1-13 11:09 | 只看该作者
本帖最后由 ifxz0123 于 2021-1-13 11:14 编辑
zhifeng 发表于 2021-1-8 19:33
电脑发不了这么快的的3ms 对windosws  不可能的

确实是,实测发现设置的3ms,实际上是16ms发送一次。有空,我再重新测试下

使用特权

评论回复
6
两只袜子| | 2021-1-14 09:02 | 只看该作者
很棒,拿走不谢

使用特权

评论回复
7
gddddd| | 2021-1-14 16:11 | 只看该作者
ifxz0123 发表于 2021-1-13 11:09
确实是,实测发现设置的3ms,实际上是16ms发送一次。有空,我再重新测试下 ...

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

使用特权

评论回复
8
LM莫| | 2021-1-14 17:19 | 只看该作者
这么快的速度不让别的事情干了吗?有时候确实是软件限制了。

使用特权

评论回复
9
换个地方合格| | 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

使用特权

评论回复
10
ifxz0123|  楼主 | 2022-8-11 08:38 | 只看该作者
换个地方合格 发表于 2022-8-10 16:23
我在测试的时候发现隔段时间就会产生一次超时中断,然后串口就会把上次接收的数据第一个字节发送出来
16:06 ...

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

使用特权

评论回复
11
换个地方合格| | 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);
    }
实测加上判断后就不会出现这个问题

使用特权

评论回复
12
Yao9520| | 2024-7-4 21:54 | 只看该作者
感谢,感谢分享 感谢大佬

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

82

主题

543

帖子

15

粉丝