[Kinetis] K60串口通信问题,忘大神指导(已解决)

[复制链接]
5817|6
 楼主| 774729254 发表于 2014-5-27 20:54 | 显示全部楼层 |阅读模式
本帖最后由 FSL_TICS_A 于 2014-6-3 16:28 编辑

现在在用K60做项目,需要使用用串口中断接收上位机命令,现在遇到的问题是,通过串口调试软件发送命令只能一个字节一个字节的发送,不能连续的发送一串字节,比如发送握手指令:fe 68 11 00 00 00 00 11 16,只能依次发送fe,68,11,00,00,00,00,11,16,发送9次,而不能一次发fe 68 11 00 00 00 00 11 16,此时调试只接收到fe这一个字节,中断程序如下:
#define FRAME_PRECURSOR_CHAR   0xfe
#define FRAME_START_CHAR       0x68
#define FRAME_END_CHAR         0x16
#define RS_NOT_KNOW               0
#define RS_AWAKEN                 1
#define RS_ORDER                  2
#define RS_DATA                   3                                
#define RS_CHECK                  4
#define RS_END                    5
void uart4_isr(void)
{
    uint8 ch;
    uint8 flag = 1;
    static unsigned char ucCount;
    static unsigned char ucDataLen;
    static unsigned char ucRecState=RS_NOT_KNOW;
    hw_uart_disable_re_int(UART_4);
    ch = hw_uart_re1(UART_4, &flag);
    if (0 == flag)
    {
    hw_uart_send1(UART_4, ch); //测试
    switch(ucRecState)
        {
            case RS_NOT_KNOW:
                 if(ch==FRAME_PRECURSOR_CHAR)
                    ucRecState++;
                 else
                    ucRecState=RS_NOT_KNOW;
                 break;
            case RS_AWAKEN:
                 if(ch==FRAME_START_CHAR)
                    ucRecState++;
                     else
                    ucRecState=RS_NOT_KNOW;
                    break;
            case RS_ORDER:
                 frame[0]=ch;
                 ucRecState++;
                 ucCount=1;
                 break;
            case RS_DATA:
                 frame[ucCount++]=ch;
                 if(ucCount==5)
                    ucRecState++;
                 break;           
            case RS_CHECK:
                 frame[5]=ch;
                    ucRecState++;
                 break;
            case RS_END:
                 check_sum =0;
                 for(ucDataLen=0;ucDataLen<5;ucDataLen++)  
                 check_sum+=frame[ucDataLen];
                 if((ch==FRAME_END_CHAR)&&(frame[5]==check_sum))  
                    process_flag=1;
                     ucRecState=RS_NOT_KNOW;
                 break;
            default:
                     ucRecState=RS_NOT_KNOW;
                     break;              
        }
     }
    hw_uart_enable_re_int(UART_4);
}  

FSL_TICS_A 发表于 2014-5-28 09:25 | 显示全部楼层
你好,楼主!
我想向你确认几点。
1. 如果你的目标是全部接收到有串口助手发出的所有自己吗?
2. 即使串口助手不能一次发所有字节,但是其机制跟手动没区别,也是顺序发送的啊,只是时间间隔比手动要快很多啊。
 楼主| 774729254 发表于 2014-5-28 10:14 | 显示全部楼层
你好,谢谢你的回复,一次发送fe 68 11 00 00 00 00 11 16这9个字节,每接收一个字节都回传一下,但是每次只回传fe,也就是说好像只接收到第一个字节,但是这9个字节按9次发送,系统能正常工作。不知道是中断优先级设置,还是要清中断标志位。
FSL_TICS_Jeremy 发表于 2014-5-28 11:39 | 显示全部楼层
我猜跟中断内清除中断标志位有关吧,如果你有逻辑分析仪的话,可以看看一次性输出9个字节的波形是怎么样的?
 楼主| 774729254 发表于 2014-5-28 15:42 | 显示全部楼层
恩,我搞定了,要设置中断优先级,可能是中断源太多,导致接收出现间断,发送的字节被舍弃了很多。还是很谢谢你。
FSL_TICS_A 发表于 2014-5-28 15:47 | 显示全部楼层
774729254 发表于 2014-5-28 15:42
恩,我搞定了,要设置中断优先级,可能是中断源太多,导致接收出现间断,发送的字节被舍弃了很多。还是很谢 ...

楼主以后有问题在交流,请结贴。
谢谢!
wokonimama 发表于 2017-4-23 12:30 | 显示全部楼层
774729254 发表于 2014-5-28 15:42
恩,我搞定了,要设置中断优先级,可能是中断源太多,导致接收出现间断,发送的字节被舍弃了很多。还是很谢 ...

楼主 你的串口中断优先级怎么设置的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

58

主题

299

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部