MK60 串口如何接收不定长度的字符串?

2019-03-26 07:46发布

    第一次用NXP的芯片,型号是MK60DN512VLQ10 ,编译器用的是CODEWARRIOR 10.6。
    之前用串口实现固定长度的数据接收并判断回复,没有问题,现在的情况是想跟别的设备对接,而这次想通过这个串口实现的功能是可以接收不定长度的字符串,根据我在STM32芯片上的经验,我选择了用总线空闲中断IDLE来进行处理,因为第一次用NXP芯片,所以我用PE生成了基本代码,但是这个生成的代码是没有IDLE使能的,所以我进行了一部分修改:使能了IDLE中断,增加了IDLE中断函数。
    实际的调试情况是没法正常工作,数据接收到没有反应,在自己定义的数据接收BUFFER里,数据顺序与实际不符,但是有点奇怪的规律,后来查过手册后,发现因为我使用的是UART1,根据数据手册描述,UART0,UART1的FIFO深度是8,其他的FIFO深度是1,那么我直接不使能FIFO是否可以解决呢?
//UART_PDD_EnableFifo(UART1_BASE_PTR, (UART_PDD_TX_FIFO_ENABLE)); /* Enable RX and TX FIFO */
    我直接注释掉了FIFO使能的语句,结果在BUFFER里的数据顺序也正常了,但是程序还是不能工作。
    根据程序运行状况,有如下问题:
    1.接收中断因为没有接收到足够的数据而不触发,但是IDLE中断又没有正确触发,因为如果触发了中断,我判断了BUFFER里的内容后,会用memset函数清除掉里面的内容。
    2.BUFFER里的数据位置问题,每次新收的数据都是在BUFFER里按顺序往下存储的,我想实现的是每次处理完成后,下次的数据进来是从
BUFFER[0]开始。
    3.PE生成的代码里有这样一个函数:
LDD_TError zigbee_ReceiveBlock(LDD_TDeviceData *DeviceDataPtr, LDD_TData *BufferPtr, uint16_t Size)
其中红字是我定义的部件名称,这个函数决定了我能收多少数据,和存储数据BUFFER,因为每次接收数据的长度不定,所以这个SIZE参数我都用的比较大,大于我收到的数据的最大长度,但是这就引出了问题1。

   请各位大神指点下,或者给个思路,因为这个芯片真的不熟悉。

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答
alexnemo
2019-03-26 21:16
目前问题已经解决,问题处在PE生成的程序中,解决方法是禁用芯片UART口的FIFO,然后修改生成的RX中断函数,跟IDLE空闲中断函数进行配合,使接收中断函数不再对FIFO溢出进行响应然后接收缓存的BUFFER指针清零,这样存入自定义BUFFER的数据顺序就不会乱,而是在总线空闲中断中进行操作,保证收到一帧完整数据后,对内容进行协议或校验判断。
这几天有事忙,没有来看帖,感谢大佬们提出的建议和方向,依靠定时器溢出来进行判断的话,在我这个应用场合不是很合用,不知道怎么结贴,请版主看到后,指点一下哈

一周热门 更多>