打印
[STM32F1]

stm32f103串口中断如何接收2.6k的大数据不丢数据

[复制链接]
楼主: HAORANAN123
手机看帖
扫描二维码
随时随地手机跟帖
21
用DMA接收数据啊,不要用串口中断接收数据,那样进出中断太频繁了。
用DMA来自动接收数据,用DMA半自动和完成中断处理数据,如果两帧数据间隔大的话,可以配合定时器超时来断帧数据。

使用特权

评论回复
22
kingkits| | 2017-12-8 10:24 | 只看该作者
你的键盘程序时有问题的
如果是定时扫描,建议做4ms左右的时间间隔,并且只做扫描(就是每次扫描只做IO输出和IO读写)其他的都在主进程里处理
如果你无法解决简化按键对中断的影响,有一个比较笨的打补丁方法,就是你在按键处理程序里检查一下串口数据,如果有,就去先处理数据,再继续处理按键。

使用特权

评论回复
23
kingkits| | 2017-12-8 10:33 | 只看该作者
其实按键只要两次IO读写就可以确定,至于长按,你可以考虑在中断里加一个计数器,只要有按键按下,就+1,考虑在主程序里做计数器清0
如果是4ms 中断,4秒的计时大概是1000次,用个16bit变量就足够了

使用特权

评论回复
24
fengfeng的恒| | 2017-12-8 13:39 | 只看该作者
按键中断里的代码太多了,还有涉及到串口发送,天知道这个发送里面会不会需要等发送一个字节完成呢?
建议把按键中断里的代码缩减,只检测键值,功能处理在主函数处理。

使用特权

评论回复
25
icecut| | 2017-12-8 17:48 | 只看该作者
2.6k也太多了吧.建议压缩一下....

使用特权

评论回复
26
caijie001| | 2017-12-8 20:21 | 只看该作者
kingkits 发表于 2017-12-7 09:57
键盘处理程序有问题,占用了太多的系统时间

循环里面的按键有啥所谓?串口接收是中断执行的

使用特权

评论回复
27
caijie001| | 2017-12-8 20:23 | 只看该作者
楼主解决了吗?我个人的看法是:串口是中断执行的程序。按键在主程序循环没啥所谓啊,不影响中断的执行,你是不是在接受后没有对数据处理?导致丢失

使用特权

评论回复
28
ngyg12| | 2017-12-9 11:47 | 只看该作者
数据输入速度 除以 处理速度 等于 你FIFO长度  可以再适量加深

使用特权

评论回复
29
HAORANAN123|  楼主 | 2017-12-9 13:17 | 只看该作者
caijie001 发表于 2017-12-8 20:23
楼主解决了吗?我个人的看法是:串口是中断执行的程序。按键在主程序循环没啥所谓啊,不影响中断的执行,你 ...

不是的,原先还有一个100ms的定时器中断了,定时器的中断优先级小于串口的优先级,应该是定时器的中断影响了串口的中断,现在把定时器去掉,所有都在主程序运行了,发现按键也不会受影响了,串口接收数据也正常了这个先前的写的中断优先级的配置
void NVIC_Configuration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_SetPriorityGrouping(2);
        

        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure);

        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
//        NVIC_InitTypeDef  NVIC_InitStructure;
//        NVIC_SetPriority(USART1_IRQn,6);
//        NVIC_EnableIRQ(USART1_IRQn);
//
//        NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn , 5);
//        NVIC_EnableIRQ(USB_LP_CAN1_RX0_IRQn);               
}

使用特权

评论回复
30
HAORANAN123|  楼主 | 2017-12-9 13:19 | 只看该作者
kingkits 发表于 2017-12-8 10:24
你的键盘程序时有问题的
如果是定时扫描,建议做4ms左右的时间间隔,并且只做扫描(就是每次扫描只做IO输出 ...

恩,这个办法好

使用特权

评论回复
31
HAORANAN123|  楼主 | 2017-12-9 13:21 | 只看该作者
ngyg12 发表于 2017-12-9 11:47
数据输入速度 除以 处理速度 等于 你FIFO长度  可以再适量加深

fifo指的就是缓冲区吧。。。

使用特权

评论回复
32
caijie001| | 2017-12-9 13:32 | 只看该作者
HAORANAN123 发表于 2017-12-9 13:17
不是的,原先还有一个100ms的定时器中断了,定时器的中断优先级小于串口的优先级,应该是定时器的中断影响 ...

那应该是中断嵌套的问题

使用特权

评论回复
33
Prry| | 2017-12-9 18:37 | 只看该作者
FIFO环形缓冲区

使用特权

评论回复
34
lvben5d| | 2017-12-9 20:31 | 只看该作者
应该是你程序处理问题吧, 接收串口的中断优先级先级选择最高, 有包头没包尾的协议设计着也是笨的,最低在包头之后某个固定位置,高速你长度,当然,你可以用字节超时中断来截包和做串口超时保护。  上位机有包头没包尾,又不告诉你指定长度的话, 那么上位机发包的间隔,要给足你超时判断也可以。这个串口的应用还是基本的。

使用特权

评论回复
35
19840312| | 2017-12-9 20:48 | 只看该作者
最简单方法:
DMA方式,大于2.6K缓冲区做乒乓,空闲中断。

使用特权

评论回复
36
座机呀| | 2017-12-9 21:46 | 只看该作者
115200,极限是14.4字节每ms,你才2.6个字节每ms,而且还是隔1秒2.6K的数据,STM32F103 72M的主频怎么写代码也不会丢数据啊?
扫一个4X4的键盘对于一个72M的单片机不要太轻松了。
这么点数据量还用不上DMA,多检查检查代码吧!

使用特权

评论回复
37
座机呀| | 2017-12-9 21:54 | 只看该作者
按键这种不用中断的,除非是唤醒,中断是你信号的频率大于你while(1)的最小处理频率,或者你要求的响应速度小于你while(1)的最长执行时间,那个时候才需要考虑中断,再说,出栈入栈这些不也消费时间吗?
DMA适用于那种超大的数据量才有使用的必要,才2.6K每秒就上DMA了,那也太小题大做了

使用特权

评论回复
38
GeekyGeek| | 2017-12-9 22:36 | 只看该作者
XON/XOFF 协议,通知上位机数据处理不及,稍后再发

使用特权

评论回复
39
minzisc| | 2017-12-10 17:09 | 只看该作者
中断还能丢失数据吗?

使用特权

评论回复
40
selongli| | 2017-12-10 17:09 | 只看该作者
把串口中断设为最高的优先级。

使用特权

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

本版积分规则