搜索
bottom↓
回复: 31

51单片机如何串行中断接收300以上字节然后用cc1100发送出去

[复制链接]

出0入0汤圆

发表于 2011-7-27 15:27:48 | 显示全部楼层 |阅读模式
stc89c52 只有256B的内部ram和256B的内部扩展ram cc1100的发送和接收缓冲区只有64字节
请问该如何一次接收大于300字节以上的数据帧 然后经cc1100发送出去

我试过串行中断 接收1个便发送1个 好像不可行啊

哪位高人有好办法

出0入0汤圆

 楼主| 发表于 2011-7-27 15:44:45 | 显示全部楼层
就是这种情况:
串口调试助手往MCU发送800个字节,然后再由MCU控制CC1100发送出去,单片机的ram不够,CC1100的发送缓冲区只有64字节

那么单片机该如何接收串口过来的数据、分段发送出去?

我用串行中断接收1个字节便发送1个字节,这样不行,接收端总是只收到1个字节。

出0入0汤圆

发表于 2011-7-27 16:36:31 | 显示全部楼层
如果CC1100的模块不是用中断发送而是查询方式,那么一般的模块连64字节都发不了,他们开发的协议还占用了一些FIFO

一般是发30个字节,等50mS.然后再发。

出0入0汤圆

 楼主| 发表于 2011-7-27 17:23:48 | 显示全部楼层
那单片机如何接收串口过来的很长的数据帧呢?定义一个30字节的数组,接收满30个就执行CC1100发送,但此时串口还有接下来的数据要接收,去执行CC1100发送,那就没法接收接下来的数据了吧

出0入0汤圆

发表于 2011-7-27 17:33:00 | 显示全部楼层
一帧(包),最多 0xff 个字节。

可以分帧(包)发送,CPU 允许的话,可以将发送间隔做的很小。

出0入0汤圆

 楼主| 发表于 2011-7-28 15:58:23 | 显示全部楼层
问题还没解决,我定义了一个30字节的数组,当串口中断接收过来的数据填满数组之后,就设置一个发送标志,然后在主函数中控制cc1100发送出去,然后清掉数组数据,再开中断允许,接收第31-60个子字节,如此循环。。。但这样每次只能接收到前30个字节,会不会是串口数据传输两个字节的间隔时间太小了,当主函数中还在处理前一组数据时,下一个串行中断已经到了。。。

我的问题不是在MCU如何分包,控制CC1100发送

而是在MCU如何接收处理PC发过来的远大于ram区的不定长数据帧(300B~10KB不等)

哪位高人有好的办法?

出0入0汤圆

发表于 2011-7-28 16:01:43 | 显示全部楼层
发送缓冲区和一个接收缓冲区

接收缓冲区满了 移到发送缓冲区(可以简单的修改下地址)  串口可以全双工的 边发边接收也没问题

出0入0汤圆

 楼主| 发表于 2011-7-28 16:06:34 | 显示全部楼层
回复【6楼】xivisi LiYong
-----------------------------------------------------------------------

MCU串口接收PC过来的数据,通过SPI总线写到CC1100,只用MCU的接收缓冲区,不用发送缓冲区

出0入0汤圆

发表于 2011-7-28 16:09:36 | 显示全部楼层
让PC每次发30个字节,发完后等待,单片机接收完成用1100发送出去以后给PC一个命令,PC继续发下面30个字节。

出0入0汤圆

 楼主| 发表于 2011-7-28 16:12:25 | 显示全部楼层
回复【8楼】titrwh
-----------------------------------------------------------------------

这个方法是从应用程序上定制一个协议,控制每次发送的字节数,是可行的

但考虑通用性的话,还是想从下位机上寻找一个解决途径

出0入0汤圆

发表于 2011-7-28 16:16:51 | 显示全部楼层
那就把串口波特率降到最低,或许可以。

出0入0汤圆

发表于 2011-7-28 16:19:34 | 显示全部楼层
串口中断一直开着接收到缓冲区(队列) 主程序里不停的发出去  要求 SPI发送速度不能比串口慢

出0入0汤圆

 楼主| 发表于 2011-7-28 16:21:33 | 显示全部楼层
回复【10楼】titrwh
-----------------------------------------------------------------------

考虑过,没试过
————————————————————————————————————

谢谢这么多人关注!

出0入0汤圆

发表于 2011-7-28 16:23:31 | 显示全部楼层
要不加一片铁电吧
PS...一回头才知道白说

出0入0汤圆

 楼主| 发表于 2011-7-28 16:24:00 | 显示全部楼层
回复【11楼】xivisi LiYong
串口中断一直开着接收到缓冲区(队列) 主程序里不停的发出去  要求 spi发送速度不能比串口慢
-----------------------------------------------------------------------

51支持多进程吗

出0入0汤圆

发表于 2011-7-28 16:27:00 | 显示全部楼层
回复【14楼】dsdh0502  
回复【11楼】xivisi liyong
串口中断一直开着接收到缓冲区(队列) 主程序里不停的发出去  要求 spi发送速度不能比串口慢
-----------------------------------------------------------------------
51支持多进程吗
-----------------------------------------------------------------------

可以理解为中断就是一个线程

出0入0汤圆

 楼主| 发表于 2011-7-28 16:27:57 | 显示全部楼层
回复【13楼】amazing030
要不加一片铁电吧
-----------------------------------------------------------------------

这个NB,没考虑过,现在市场上的无线数传模块好像都是51、avr等mcu控制,没有其他的外接存储器,不知道他们怎么处理这样问题的,哎,俺没经验啊

出0入0汤圆

 楼主| 发表于 2011-7-28 16:32:48 | 显示全部楼层
回复【15楼】xivisi LiYong
串口中断一直开着接收到缓冲区(队列) 主程序里不停的发出去  要求 spi发送速度不能比串口慢
-----------------------------------------------------------------------
51支持多进程吗
-----------------------------------------------------------------------
可以理解为中断就是一个线程
-----------------------------------------------------------------------
不知道怎么编程实现。。。SPI传输的速度是比串口快的多

出0入0汤圆

发表于 2011-7-28 16:41:04 | 显示全部楼层
回复【17楼】dsdh0502  
-----------------------------------------------------------------------
缓冲处理:一个字节保存缓冲区数据当前长度,发送一个字节将已有数据全部向前移一位,长度减1,接收到一个字节放在已有数据后面 长度加1

串口处理: 收到一个字节进入中断,把数据放入缓冲区(判断缓冲区是否满,如果未满则按缓冲处理,如果满根据需要决定是否丢弃数据)

SPI处理:如果缓冲区有数据则发送 并等待发送完成或者进入中断,

出0入33汤圆

发表于 2011-7-28 16:47:37 | 显示全部楼层
支持6楼的办法。

出0入0汤圆

 楼主| 发表于 2011-7-28 17:01:19 | 显示全部楼层
回复【18楼】xivisi LiYong
回复【17楼】dsdh0502   
-----------------------------------------------------------------------
缓冲处理:一个字节保存缓冲区数据当前长度,发送一个字节将已有数据全部向前移一位,长度减1,接收到一个字节放在已有数据后面 长度加1
串口处理: 收到一个字节进入中断,把数据放入缓冲区(判断缓冲区是否满,如果未满则按缓冲处理,如果满根据需要决定是否丢弃数据)
spi处理:如果缓冲区有数据则发送 并等待发送完成或者进入中断,

-----------------------------------------------------------------------

我之前定义了30字节的缓冲区,当缓冲区满的时候,设置发送标志,然后进行的就是你说的“SPI处理”,不过数据还没处理完,串口下一个中断就到了,导致我每次只接收到前30个字节,后面的字节一概没收到

出0入0汤圆

发表于 2011-7-28 17:05:43 | 显示全部楼层
回复【20楼】dsdh0502  
-----------------------------------------------------------------------

不要关中断 也不要等到满了才发  只要有数据就发

出0入0汤圆

 楼主| 发表于 2011-7-28 17:09:36 | 显示全部楼层
回复【21楼】xivisi LiYong
回复【20楼】dsdh0502   
-----------------------------------------------------------------------
不要关中断 也不要等到满了才发  只要有数据就发
-----------------------------------------------------------------------

哦,试试您的方法先,谢过!

出0入0汤圆

发表于 2011-8-4 22:45:24 | 显示全部楼层
试的咋样了

出0入0汤圆

发表于 2011-8-6 11:35:40 | 显示全部楼层
把波特率调低,然后串口接收到就发送给CC1100。试试看。

出0入0汤圆

发表于 2011-8-16 14:54:33 | 显示全部楼层
不要想的那么复杂,给你个方法:
定义一个200(或其他数值)字节的缓冲区接收串口数据,两个指针(或变量)一个指向接收到的最后一字节,一个指向需要发送的第一字节。两个指针之差就是你需要发射的数据字节数。那么:
1、当检测到需要发射的数据大于或等于64,那么立即进行一次RF发射。
2、当检测到需要发射的数据小于64,且有一段时间没有接收到新的串口数据了(比如3ms,5ms,自定),那么认为,来自串口的数据暂时就这些了,无需等到满64个字节。那么,立即将这些数据发射出去。
3、200字节buffer环形缓冲区,两个指针不断同方向游走循环,当Ptr_rx == Ptr_tx时,说明没有需要发射的数据。

长此以往,直到没有需要发射的数据为止。

出0入0汤圆

发表于 2011-8-16 17:21:48 | 显示全部楼层
楼上和我想的一样   叫循环 BUF  对吧?
可以想象成一个先入先出的管道

出0入0汤圆

发表于 2011-8-16 23:49:47 | 显示全部楼层
LZ,此法已经屡试不爽了,请照用即可。

仔细计算一下你的串口波特率和RF空中速率、单片机处理时间发射时间等,你可以知道串口和无线信道的带宽之比。假设只用1/3的RF时间即可处理你的串口数据,那么,剩余2/3时间则可以用于处理碰撞、干扰、重发等。你玩的好,合理的算法,可以做到真正的全双工。如果还有剩余带宽,甚至可以实现跳频。

我们曾在项目中用nRF24L01+,就是以此实现全双工通信+4信道跳频。

出0入0汤圆

 楼主| 发表于 2011-8-18 16:32:10 | 显示全部楼层
回复【27楼】liyong110
-----------------------------------------------------------------------

回复【27楼】liyong110
lz,此法已经屡试不爽了,请照用即可。
仔细计算一下你的串口波特率和rf空中速率、单片机处理时间发射时间等,你可以知道串口和无线信道的带宽之比。假设只用1/3的rf时间即可处理你的串口数据,那么,剩余2/3时间则可以用于处理碰撞、干扰、重发等。你玩的好,合理的算法,可以做到真正的全双工。如果还有剩余带宽,甚至可以实现跳频。
我们曾在项目中用nrf24l01+,就是以此实现全双工通信+4信道跳频。
-----------------------------------------------------------------------

也就是说要保证空中速率大于(串口波特率+单片机程序运行时间),才能实现环形buffer存储变量的方法。。?

出0入0汤圆

发表于 2011-8-18 18:40:52 | 显示全部楼层
据说stc89c52有1280字节RAM的

出0入0汤圆

 楼主| 发表于 2011-8-19 09:34:04 | 显示全部楼层
回复【29楼】chess01 =CHESS
据说stc89c52有1280字节ram的
-----------------------------------------------------------------------

stc89c54以上型号才有1280字节ram

出0入0汤圆

发表于 2011-8-21 18:13:08 | 显示全部楼层
那分帧发送了,接收端怎么将接收到的数据组帧?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 10:57

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表