打印

MSP430串口接收数据,只进接收中断一次

[复制链接]
4338|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
baiyu00747|  楼主 | 2016-3-23 18:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
发送字符串:5F0600000200005B510600000C0000060100011603290728004E5F060000030000FEA4
为什么只能进中断一次 ,第二次再发就进不了中断了?而关闭串口助手,再次打开就又可以进中断一次。



#include  <msp430x16x.h>

unsigned char RecBuf[35]; //接收数据缓存
unsigned char Rindex;     //接收数据计数
unsigned char Rinflag;    //接收血糖数据包完毕标志
/*******************************************************/
void Uart_init(void);
/*******************************************************/
void Uart_init(void)
{
    P3SEL |= 0x30;                            // 选择P3.4TX和P3.5RX做UART通信端口
    ME1 |= UTXE0 + URXE0;                     // 使能USART0的发送和接受
    UCTL0 |= CHAR;                            // 选择8位字符
    UTCTL0 |= SSEL1;                          // UCLK = SMCLK时钟源选择8M
    UBR00 = 0x8A;                             // 波特率57600设定
    UBR10 = 0x00;                             //
    UMCTL0 = 0xDE;                            // Modulation
    UCTL0 &= ~SWRST;                          // 初始化UART状态机
    IE1 |= URXIE0;                            // 使能USART0的接收发送中断
}
/*******************************************************/
void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;              // 关闭看门狗
    volatile unsigned int i;
    BCSCTL1 &= ~XT2OFF;                       // XT2on
    do
     {
      IFG1 &= ~OFIFG;                        // Clear OSCFault flag
      for (i = 0xFF; i > 0; i--);            // Time for flag to set
     }
    while ((IFG1 & OFIFG));                   // OSCFault flag still set
    BCSCTL2 |= SELM_2 + SELS;                 // MCLK = SMCLK = XT2 (safe)
   
    Uart_init();
   
    while(1)
    {
     _BIS_SR(LPM0_bits+GIE);
     //IE1 |= URXIE0;                            // 使能USART0的接收发送中断
    }
}

#pragma vector = UART0RX_VECTOR
__interrupt void UART0_RXISR(void)
{
    RecBuf[Rindex++] = RXBUF0;
    if(RecBuf[Rindex-2]==0xFE) //接收完毕
    {
        Rindex=0;
        if(RecBuf[0]==0x5F)    //帧头正确
        {
          Rinflag=1;  
        }
    }
}

相关帖子

沙发
dirtwillfly| | 2016-3-23 20:55 | 只看该作者
好奇怪的问题

使用特权

评论回复
板凳
dirtwillfly| | 2016-3-24 07:59 | 只看该作者
建议断开单片机和pc的连接,用逻辑分析仪观察一下时序,看是否正确

使用特权

评论回复
地板
tongbu2015| | 2016-3-24 16:15 | 只看该作者
这个进一次中断后及时清除相关的中断标志为了么?

使用特权

评论回复
5
angerbird| | 2016-3-24 17:19 | 只看该作者
这个就看是否及时清除掉中断标志位的。

使用特权

评论回复
6
xstong| | 2016-3-25 09:41 | 只看该作者
和单片机无关,估计你用的是USB转串口线,上位机驱动不稳定。遇到过相同问题。买个品质好点的就行了。

使用特权

评论回复
7
smilingangel| | 2016-3-25 16:02 | 只看该作者
这个跟你进入的低功耗模式有关系的

使用特权

评论回复
8
baiyu00747|  楼主 | 2016-3-25 22:59 | 只看该作者
smilingangel 发表于 2016-3-25 16:02
这个跟你进入的低功耗模式有关系的

我试过 把低功耗去掉也是那样子  智能接收一次数据包。。有一种感觉就是貌似串口里接收一组数据完毕后有一个字节数据没有读出来,导致第二个进不了中断。

使用特权

评论回复
9
baiyu00747|  楼主 | 2016-3-25 23:02 | 只看该作者
xstong 发表于 2016-3-25 09:41
和单片机无关,估计你用的是USB转串口线,上位机驱动不稳定。遇到过相同问题。买个品质好点的就行了。 ...

倒是没试过换过转换线,但是我用单片机个带有串口的血糖模块做串口数据对接,也是只能接收一组数据,第二组的话要复位一下单片机唉,这个过程并没有用到USB转串口线

使用特权

评论回复
10
baiyu00747|  楼主 | 2016-3-25 23:03 | 只看该作者
angerbird 发表于 2016-3-24 17:19
这个就看是否及时清除掉中断标志位的。

430单片机的中断标志是读完数据后自动清除读标志位的吧

使用特权

评论回复
11
baiyu00747|  楼主 | 2016-3-25 23:04 | 只看该作者
tongbu2015 发表于 2016-3-24 16:15
这个进一次中断后及时清除相关的中断标志为了么?

430单片机的中断标志是读完数据后自动清除读标志位的

使用特权

评论回复
12
数码小叶| | 2016-3-26 11:15 | 只看该作者
猜测中断处理函数逻辑有问题

使用特权

评论回复
13
dirtwillfly| | 2016-3-26 11:45 | 只看该作者
还是建议楼主观察一下时序,看看是通讯的问题,还是程序出问题了。

使用特权

评论回复
14
baiyu00747|  楼主 | 2016-3-26 14:37 | 只看该作者
dirtwillfly 发表于 2016-3-26 11:45
还是建议楼主观察一下时序,看看是通讯的问题,还是程序出问题了。

手边现在没有示波器唉 这个现在就是上学 没有正式的实验室

使用特权

评论回复
15
dirtwillfly| | 2016-3-26 17:42 | 只看该作者
baiyu00747 发表于 2016-3-26 14:37
手边现在没有示波器唉 这个现在就是上学 没有正式的实验室

买个30元左右的逻辑分析仪就行,对调试通讯很有用

使用特权

评论回复
16
51xlf| | 2016-3-26 22:45 | 只看该作者
使用软件清除标志位

使用特权

评论回复
17
51xlf| | 2016-3-26 22:47 | 只看该作者
看看电路设计的是不是符合要求

使用特权

评论回复
18
FireRiver9| | 2016-3-28 12:05 | 只看该作者
每次都是中断一次吗,中断标志位清除掉了吗

使用特权

评论回复
19
bobde163| | 2016-3-29 23:36 | 只看该作者
也有可能是Rindex这个变量一开始就没有初始化为0,导致第一帧数据就已经接收错误了,而且中断函数里也没有针对如果检测到的倒数第2个字节不是0xFE的情况进行处理,一旦有一帧数据接收错误就会有问题

使用特权

评论回复
20
SUNB1234| | 2019-10-8 22:14 | 只看该作者
楼主解决了吗?我也遇到了这个问题

使用特权

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

本版积分规则

2

主题

13

帖子

0

粉丝