大家好,小弟目前正在做一个项目,里面涉及到上位机通过串口(RS232)与DSP进行大批量数据的收发,板子上用的通信芯片是MAX3111EEWI,自带一个8-word-deep-receive FIFO,好像不处理的情况下一包数据只能接收16个字节。
之前的程序中数据收发过程为轮询式的,大概过程是这样的:上位机给DSP的数据按包发送,DSP这边一个个依次接收,收到一个赋给另一个变量,而且这样接收的时候最多的时候上位机一次只能发送13、14个字节,再多的话就不稳定了,DSP这边经常收不到或者收不全。
现在的问题是这样的,由于特殊要求上位机与DSP需要进行大批量数据的收发,一次最多可能达到1000多个字节(暂定1041个字节),这样的情况下上面提到的轮询式收发机制已经不能用了,所以想问问各位大侠像这样数据量比较大的时候,一般都用什么样的收发机制,有没有什么更好的办法呢,看看有没有什么思路或者建议,很着急啊,谢谢大家
通讯的时候,数据肯定是要经过FIFO的,你也说了FIFO大小只有8个字,那也就是16个字节吧。这样一个数据包只能包16个字节是很正常的事情。你所说的之前用的轮询式,我猜测应该是把大体积的数据分割成多个小体积的数据分次发送的意思吧,这样就必须在数据包中标明该数据包包含的小体积数据,在大体积数据中的位置。这样的结构占去一两个字节用于数据位置的说明也是很正常的。
如果你想要一次进行大批量的数据收发,基本上还是要走上面这种轮询式的老路,在函数内分割和整合数据,而你调用函数的时候,看起来就好像一次收发成功的一样。当然这个分割整合的结构怎么搭配,作业完成的信号通知怎么交互,直接影响到整个函数的效率。这也是考验程序员水平的地方
谢谢 C_Rabbit,我好想有点明白了
不好意思,刚才说的可能不是很明白,这里再补充两点点,首先这里现在主要涉及到的是数据的接收(主要针对DSP端,上位机数据发送部分已经确定,不可更改)
其次,前面说的轮询式也是针对DSP接收上位机发送过来的数据时采用轮询式。另外,我这里的轮询的过程是这样的:DSP程序中串口数据接收都是调用同一个函数,调用一次接收一个字节的数据,处理结束之后再调用该函数再接收下一个数据(这里的处理主要是把刚才接收到的数据赋给其他的变量保存,以备后面使用,因为这里的串口数据接收函数为同一个,如果不每次把接收到的数据赋给其他的变量,下次调用该函数时上次收到的数据将被冲掉)。
所以这样做会出现下面几个问题,首先如果像前面那样调用一次函数接收一个字节的数据,如果一包数据十几个的时候还好,我反复多调用几次也没什么,现在一次需要发送1000多个字节,再这样调用程序代码太长,不可实现;其次,每次接收的时候需要另外定义一个全局变量去接收该数据,现在怎么办,定义一个长度为1000的数组么;还有这个处理时间、处理效率,也不好掌握,不好处理。
以前没细想过这些,现在要用了发现哪里都是问题,大家帮我出出主意,看看有没有什么更好的办法,谢谢大家啦
不明白这是啥意思,不过我也在做一个硬件相关的软件,好多都不懂,在这里转了好长时间了。。。。迷茫。。。。
引用: 引用 3 楼 bendanban 的回复:
不明白这是啥意思,不过我也在做一个硬件相关的软件,好多都不懂,在这里转了好长时间了。。。。迷茫。。。。
不好意思,我哪里没说明白呢,你说说哪里不清楚,我再解释一下,就当大家交流交流嘛
事实上,只要你想要做1000字节的大数据包通信,而且由一个函数来完成这个操作。那么你就必须给这个大数据包预留一个FIFO空间出来,这是没有办法的事情。在函数运行的过程中,数据必须要有一个可以依托的空间,这是通信环节中的必然条件。也因此,通信的数据包吞吐能力,实际上就是有你能够给予的FIFO空间大小能力决定的
引用: 引用 5 楼 c_rabbit 的回复:
事实上,只要你想要做1000字节的大数据包通信,而且由一个函数来完成这个操作。那么你就必须给这个大数据包预留一个FIFO空间出来,这是没有办法的事情。在函数运行的过程中,数据必须要有一个可以依托的空间,这是通信环节中的必然条件。也因此,通信的数据包吞吐能力,实际上就是有你能够给予的FIFO空间大小能力决定的
c_rabbit,你好。你这里提到的的FIFO是什么意思呢?
我前面说的16个字节的FIFO是我板子上用到的通信芯片(MAX3111EEWI)自带的,也就是该芯片内部有自带一个8-word-deep-receive FIFO。
如果我自己定义一个大小为1000字节的数组,然后通过for循环反复调用串口数据接收函数,每次接收一个字节,并将这些数据先存到该数组中,等1000个字节全部接收完毕后再进行下一步处理。这样子可不可以呢
引用: 引用 6 楼 haoxuesheng1106 的回复:
引用 5 楼 c_rabbit 的回复:
事实上,只要你想要做1000字节的大数据包通信,而且由一个函数来完成这个操作。那么你就必须给这个大数据包预留一个FIFO空间出来,这是没有办法的事情。在函数运行的过程中,数据必须要有一个可以依托的空间,这是通信环节中的必然条件。也因此,通信的数据包吞吐能力,实际上就是有你能够给予的FIFO空间大小能力决定的
c_rabbit,你好。你这里提到的……
对,我说的FIFO就是你理解的这个意思。你说的这个办法也是可行的
好的
谢谢C_Rabbit,谢谢大家。
我先试试,有什么进展随时跟大家分享
对了,刚想起一个问题
我在之前做的过程中遇到的问题是这样的:如果上位机一次发送数据较多的时候(一包14,15个字节),DSP端接收就会出问题,经常接收不到或者接收不全,那现在上位机要一次发送1000多个字节,即使我在DSP中定义再大的FIFO,后面的数据接不到,那还是不行啊;而且DATASHEET上说自带8word FIFO,也就是16个字节,但调试过程中发现最多也就接收14个字节,再大就不行了。
大家帮我分析一下这是什么问题呢,是不是每次接收完数据要把该通信芯片自带的FIFO清空,不过这个号称是FIFO,那最上面一个应该就是最新的数据了,每次接收那个就好了啊
谢谢大家啦
大包-》分成小包,但到了小包的时候,受硬件条件限制,只能是16个字节。
引用: 引用 10 楼 hantown 的回复:
大包-》分成小包,但到了小包的时候,受硬件条件限制,只能是16个字节。
不好意思,您这里说的大包分成小包是什么意思,试说在上位机发的时候就把一大包数据分成若干个小的数据包,再一个个分开发送么?
我这里现在的问题是上位机那部分已经定了,就是一次发这么多,改不了,只能在DSP接收这里想想办法
还是不行啊,上位机一次发送数据多于15个字节,DSP接收就不正常了
大家帮我分析一下,看看可能是什么原因,接受的时候需要进行怎么处理呢
谢谢大家啦