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条回答
gsll
1楼-- · 2019-03-26 13:36
在一个GPS数据处理的程序里是这样搞得,stm32判断接收不定长的数据时是加了个定时器,有数据发过来时启动定时器,在设定的时间内没有新的数据到来即认为一帧数据接收完成,进行判断。NXP芯片没有过,只能给你说个思路。
chunyang
2楼-- · 2019-03-26 15:02
从楼主的题目看,不定长字符的串口通迅是基于字节的,但看楼主帖内容,却提及到FIFO和接收中断,显然串口通迅程序本身尚存在问题,还没轮到字符串是否定长的问题。要先解决串口操作本身,这个与字符串是否定长无关,在串口接收中断服务程序中做个数据转存就好。至于不定长通迅判断结束的方法有两种,一是采用协议,协议内容可以包含帧长度信息,也可以用约定的结束符来表达。二是采用时间判定,如2楼所言。接收到第一个字节后,启动一个定时器,每接收到一个字节清零一次定时器,当定时器溢出时,可以认为通迅已经结束。对于连续通迅,定时时长可以根据波特率选择1.5-2.5个字节时长。对于非连续通迅,需要考虑发送方最大字节间隔并在此基础上增加1.5-2.5个字节时长。如果是频繁的大数据量不定长通迅,尤其是无线通迅和在强干扰下的通迅,最好采用通迅协议来解决而非延时法。
ienglgge
3楼-- · 2019-03-26 17:15
 精彩回答 2  元偷偷看……
alexnemo
4楼-- · 2019-03-26 21:16
目前问题已经解决,问题处在PE生成的程序中,解决方法是禁用芯片UART口的FIFO,然后修改生成的RX中断函数,跟IDLE空闲中断函数进行配合,使接收中断函数不再对FIFO溢出进行响应然后接收缓存的BUFFER指针清零,这样存入自定义BUFFER的数据顺序就不会乱,而是在总线空闲中断中进行操作,保证收到一帧完整数据后,对内容进行协议或校验判断。
这几天有事忙,没有来看帖,感谢大佬们提出的建议和方向,依靠定时器溢出来进行判断的话,在我这个应用场合不是很合用,不知道怎么结贴,请版主看到后,指点一下哈
alexnemo
5楼-- · 2019-03-27 02:34
chunyang 发表于 2019-1-18 17:16
从楼主的题目看,不定长字符的串口通迅是基于字节的,但看楼主帖内容,却提及到FIFO和接收中断,显然串口通 ...

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

一周热门 更多>