OpenEdv-开源电子网

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

通过串口接受数据的时候开发板经常卡死

[复制链接]

7

主题

33

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2018-1-31
在线时间
10 小时
发表于 2018-2-13 08:50:19 | 显示全部楼层 |阅读模式
24金钱
如题,在main函数里的串口处理语句里,我实现了通过串口发数据,开发板转换数据的功能:发送(+/-)x,例如发送+10表示原pwm的值+10,发送1235表示把原来pwm值直接赋值为1235
问题是发送数据的时候,开发板经常卡死,不知为什么。

if(USART_RX_STA&0x8000)                //1000 0000 0000 0000,收到消息时执行
{
        len=USART_RX_STA&0x3fff;                //得到此次接收到的数据长度0011 1111 1111 1111
        tem = 0;
        s = 1;
        if(USART_RX_BUF[0] == '+'){                //如果输入为+xx如+10,那么在原来pwm值上+10
                s = 1;
                for(t = len - 1;t > 0;t--)                //tem存储串口读取的数值将USART_RX_BUF[]转换成一个数值
                {
                        tem += (USART_RX_BUF[t] - 48)*s;
                        s *= 10;
                }
                PwmVal += tem;
        }
        else if(USART_RX_BUF[0] == '-'){                //如果输入为-xx如-10,那么在原来pwm值上-10
                tem = PwmVal;
                s = 1;
                for(t = len - 1;t > 0;t--)
                {
                        if(tem < (USART_RX_BUF[t] - 48)*s){
                                tem = 0;
                                t = 1;
                        }
                        else
                                tem -= (USART_RX_BUF[t] - 48)*s;
                        s *= 10;
                }
                PwmVal = tem;
        }
        else                //直接给pwm赋值
        {
                s = 1;
                for(t = len - 1;t > 0;t--)
                {
                        tem += (USART_RX_BUF[t] - 48)*s;
                        s *= 10;
                }
                tem += (USART_RX_BUF[0] - 48)*s;
                PwmVal = tem;
        }
        USART_RX_STA=0;
}


最佳答案

查看完整内容[请看2#楼]

不要在 中断服务函数里面做这么多for循环!精简,精简,再精简~
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-2-13 08:50:20 | 显示全部楼层
不要在 中断服务函数里面做这么多for循环!精简,精简,再精简~
回复

使用道具 举报

7

主题

33

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2018-1-31
在线时间
10 小时
 楼主| 发表于 2018-2-13 08:57:16 | 显示全部楼层
如果改成:
if(USART_RX_STA&0x8000)                //1000 0000 0000 0000,收到消息时执行
{
        len=USART_RX_STA&0x3fff;                //得到此次接收到的数据长度0011 1111 1111 1111
        USART_RX_STA=0;
}
这样就不会卡死,但是。。。。。。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 10:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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