搜索
bottom↓
回复: 14

MSP430的串口问题

[复制链接]

出0入14汤圆

发表于 2014-7-1 17:27:10 | 显示全部楼层 |阅读模式
volatile unsigned char uartA0Rec_time;
#define MODBUS_BYTE_IT        4        //MODBUS 字节间隔时间

if(uartA0Rec_time>MODBUS_BYTE_IT)
{
}
今天调试串口,发现通信总是会经常断一下,在线调试发现是if()里面的语句执行不正常,uartA0Rec_time ==0 的时候会执行,

uartA0Rec_time 在定时器中每ms +1,串口接收数据中每收到一个数据清零。

现在是想不通为什么会执行

出0入14汤圆

 楼主| 发表于 2014-7-1 17:34:27 | 显示全部楼层
有人可以指点下,在哪会造成它会执行呢

出0入0汤圆

发表于 2014-7-1 17:51:44 | 显示全部楼层
整个程序贴出来

出0入14汤圆

 楼主| 发表于 2014-7-1 17:56:46 | 显示全部楼层

整个程序很大的,很多歌文件,

if(uartA0Rec_time>MODBUS_BYTE_IT)
        {
                if(modbus_state != EV_READY)
                {
                        if(uartA0Rec_time>MODBUS_BYTE_IT)        //这个不能省略????
                        {
                                if(modbus_state == EV_FRAME_RCR)
                                {
                                        RS485_debug();
                                }
                                modbus_state = EV_READY;
                               
                                uartA0Rec_time = 0;
                                uartA0Rec_cnt = 0;
                                UartA0RecvLength = 0;
                        }
                }
        }
加了红色那个就没出现问题的现象了,很奇怪

原来是在 RS485_debug(); 这个函数内设置断点,当出现错误的时候,查看 uartA0Rec_time 的结果是 0 ,其他正常时候是 5。

出0入0汤圆

发表于 2014-7-2 09:27:53 | 显示全部楼层
isakura 发表于 2014-7-1 17:56
整个程序很大的,很多歌文件,

if(uartA0Rec_time>MODBUS_BYTE_IT)

怎么可能和颜色有关系?
程序要DOWN进去再调试。
你估计以前调试的时候代码并没有DOWN进去

出0入0汤圆

发表于 2014-7-2 09:40:29 | 显示全部楼层
可能unsigned char 太短,溢出了.

出0入0汤圆

发表于 2014-8-1 12:07:17 | 显示全部楼层
volatile 定义的变量是不会被程序自动优化的,也就是说它每次取值都是从初始化地址中取得,你2次的uartA0Rec_time可能不一样

出0入14汤圆

 楼主| 发表于 2014-8-1 16:12:37 | 显示全部楼层
zhanglei1986145 发表于 2014-7-2 09:27
怎么可能和颜色有关系?
程序要DOWN进去再调试。
你估计以前调试的时候代码并没有DOWN进去 ...

我是下载到芯片里面实际通讯调试的,我当时也想不通的

出0入14汤圆

 楼主| 发表于 2014-8-1 16:15:25 | 显示全部楼层
足迹 发表于 2014-8-1 12:07
volatile 定义的变量是不会被程序自动优化的,也就是说它每次取值都是从初始化地址中取得,你2次的uartA0Re ...

不是说加了volatile之后,才不会被优化,这样才是对的嘛?
每次取值都要重新取一次,这样才不会错过被定时器修改而没取到,我这个值只在定时器中被修改的

出0入0汤圆

发表于 2014-8-1 17:16:22 | 显示全部楼层
isakura 发表于 2014-8-1 16:15
不是说加了volatile之后,才不会被优化,这样才是对的嘛?
每次取值都要重新取一次,这样才不会错过被定 ...

对呀,就是这个意思,你中断里有2次判断,值可能是不一样的

出0入14汤圆

 楼主| 发表于 2014-8-1 23:10:30 | 显示全部楼层
足迹 发表于 2014-8-1 17:16
对呀,就是这个意思,你中断里有2次判断,值可能是不一样的

可是实际的是我不加这个才有问题....

if(uartA0Rec_time>MODBUS_BYTE_IT)
        {
                if(modbus_state != EV_READY)
                {
                       // if(uartA0Rec_time>MODBUS_BYTE_IT)        //这个不能省略????
                        {
                               if(modbus_state == EV_FRAME_RCR)
                                {
                                        RS485_debug();
                                }
                                modbus_state = EV_READY;
                              
                                uartA0Rec_time = 0;
                                uartA0Rec_cnt = 0;
                                UartA0RecvLength = 0;
                        }
                }
        }
假设我把红色部分注释掉,然后在绿色部分设置一个断点,然后可以看到运行到绿色地方的时候 uartA0Rec_time 的值为 0;我一直想不通是为什么;

这个频率出现很高,5~10s基本出现一次;

出0入0汤圆

发表于 2014-8-1 23:24:09 | 显示全部楼层
试试不优化呢?

出0入14汤圆

 楼主| 发表于 2014-8-2 09:53:23 | 显示全部楼层

应该没有被优化吧,我用的是IAR的,安装好设置就没改变

出0入0汤圆

发表于 2014-8-2 10:14:51 | 显示全部楼层
isakura 发表于 2014-8-2 09:53
应该没有被优化吧,我用的是IAR的,安装好设置就没改变

默认是低优化,要设置成无优化试试.

出0入14汤圆

 楼主| 发表于 2014-8-2 10:44:57 | 显示全部楼层
cqfeiyu 发表于 2014-8-2 10:14
默认是低优化,要设置成无优化试试.

那我到时候测试下,谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 07:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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