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个字节数据后再发回给串口助手。
发送接收回环压力测试,可以看到没有数据丢失
电脑发不了这么快的的3ms 对windosws不可能的 不错, 收藏了 不错,谢谢楼主分享。 本帖最后由 ifxz0123 于 2021-1-13 11:14 编辑
zhifeng 发表于 2021-1-8 19:33
电脑发不了这么快的的3ms 对windosws不可能的
确实是,实测发现设置的3ms,实际上是16ms发送一次。有空,我再重新测试下 很棒,拿走不谢 ifxz0123 发表于 2021-1-13 11:09
确实是,实测发现设置的3ms,实际上是16ms发送一次。有空,我再重新测试下 ...
应该只是显示不过来,看串口助手收和发的字节数是对上号的,感觉很棒,果然是硬件不足软件补,减少了没有DMA的遗憾 这么快的速度不让别的事情干了吗?有时候确实是软件限制了。 我在测试的时候发现隔段时间就会产生一次超时中断,然后串口就会把上次接收的数据第一个字节发送出来
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 换个地方合格 发表于 2022-8-10 16:23
我在测试的时候发现隔段时间就会产生一次超时中断,然后串口就会把上次接收的数据第一个字节发送出来
16:06 ...
通过你的描述,我还无法定位问题出在哪里。需要借助逻辑分析仪,从时序上去判断在哪一块出了问题 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);
}
实测加上判断后就不会出现这个问题 感谢,感谢分享 感谢大佬
页:
[1]