打印

通讯中的全局变量问题请教

[复制链接]
793|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cpu51|  楼主 | 2016-3-6 13:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
使用CPU:m128
用途:485通讯
问题现象:
定义 unsigned char rec_counter,rec_num;
串口接收中断中,rec_counter+1;同时启动10ms计时器,时间溢出后,表示一帧完成,在计时器溢出中断中 rec_num=rec_counter;这个时候,如果一帧数据个数在12以内没有问题,只要超过12个数据,就一直rec_num=12,但rec_counter正常。
后来不在定时器溢出中断中将rec_num=rec_counter;将移到MAIN主程序中,rec_num=rec_counter;赋值就正确。求解。
              

相关帖子

沙发
cpu51|  楼主 | 2016-3-6 13:21 | 只看该作者
//*****************************************************************************
//接收中断  将收到的数据放入表1,然后计数器加1,启动定时器。
//*****************************************************************************
#pragma interrupt_handler uart1_rx_isr:iv_USART1_RXC
void uart1_rx_isr(void)
{
  comm_led_l;          //接收指示灯亮  
  TCNT1H = 0xFF; //reload counter high value
  TCNT1L = 0xAA; //reload counter low value
  TCCR1B = 0x04; //start Timer
                      //uart has received a character in UDR                                          
  rec_data_tab[rec_counter]=UDR1;  //接收数据存入数组   
  rec_counter++;        //接收计数器  
}

#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCCR1B = 0x00; //stop
TCNT1H = 0xFF; //reload counter high value
TCNT1L = 0xAA; //reload counter low value
rec_num=rec_counter;  
rec_counter=0;   //接收计数器置零
data_new=1;      //有新数据标志
comm_led_h;
}

使用特权

评论回复
板凳
zyj9490| | 2016-3-6 18:36 | 只看该作者
只能说明判断一裭收完的时间太短,你应把串口接收中断中清计时器的值动作考量进去,就可以了,只有没有串口接收时才会计时溢出,才算是一贞数据接收完毕。其他在主循环里处理。

使用特权

评论回复
地板
cpu51|  楼主 | 2016-3-6 21:32 | 只看该作者
zyj9490 发表于 2016-3-6 18:36
只能说明判断一裭收完的时间太短,你应把串口接收中断中清计时器的值动作考量进去,就可以了,只有没有串口 ...

同样的程序,在ATmega16中运行正常,移植到ATMEGA128中,就出现这样的问题,有点想不懂,但判断串口时间很长了,M16中可以做到1ms正常工作。‘应把串口接收中断中清计时器的值动作考量进去’,这个什么是‘清计时器的值动作考量进去’?没看懂你说的是什么意思。

使用特权

评论回复
5
zyj9490| | 2016-3-6 23:31 | 只看该作者
cpu51 发表于 2016-3-6 21:32
同样的程序,在ATmega16中运行正常,移植到ATMEGA128中,就出现这样的问题,有点想不懂,但判断串口时间 ...

你是上位机发下来命领,然后MCU给响应是吗,命领是随机的,应是命领贞发完后过10MS后才判断接收完成,因此10MS是命领完成才开始计时的,接收一个BYTE后,在串口中断里清计时器,保证串口接收时不会超时,命领贞完成后,才会超时,才被认定一贞完成。

使用特权

评论回复
6
w522930954| | 2016-3-7 08:51 | 只看该作者
串口接受到字节的时候开启定时器,是不是定时器没有清空,还一直在走,所以10ms正好是你12个字节接受完的时间,超过12个字节都会进入中断?
单片机不一样就正常了?是不是2个单片机的定时器清零方式不一样?导致一个单片机的定时器能清零,另外一个不能清零导致的?
好好看看定时器的资料啊。。

使用特权

评论回复
7
cpu51|  楼主 | 2016-3-9 19:05 | 只看该作者
w522930954 发表于 2016-3-7 08:51
串口接受到字节的时候开启定时器,是不是定时器没有清空,还一直在走,所以10ms正好是你12个字节接受完的时 ...

不是的,串口每接一个字,都清计时器,重新计时,10ms溢出还是20ms溢出,2ms溢出,都是这样现象,只能到12,换句话就是rec_counter变量正确,rec_num就不正确。

使用特权

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

本版积分规则

98

主题

457

帖子

0

粉丝