打印
[Kinetis]

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

[复制链接]
5478|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个字节的波形是怎么样的?

使用特权

评论回复
5
774729254|  楼主 | 2014-5-28 15:42 | 只看该作者
恩,我搞定了,要设置中断优先级,可能是中断源太多,导致接收出现间断,发送的字节被舍弃了很多。还是很谢谢你。

使用特权

评论回复
6
FSL_TICS_A| | 2014-5-28 15:47 | 只看该作者
774729254 发表于 2014-5-28 15:42
恩,我搞定了,要设置中断优先级,可能是中断源太多,导致接收出现间断,发送的字节被舍弃了很多。还是很谢 ...

楼主以后有问题在交流,请结贴。
谢谢!

使用特权

评论回复
7
wokonimama| | 2017-4-23 12:30 | 只看该作者
774729254 发表于 2014-5-28 15:42
恩,我搞定了,要设置中断优先级,可能是中断源太多,导致接收出现间断,发送的字节被舍弃了很多。还是很谢 ...

楼主 你的串口中断优先级怎么设置的

使用特权

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

本版积分规则

58

主题

299

帖子

1

粉丝