51单片机如何串行中断接收300以上字节然后用cc1100发送出去
stc89c52 只有256B的内部ram和256B的内部扩展ram cc1100的发送和接收缓冲区只有64字节请问该如何一次接收大于300字节以上的数据帧 然后经cc1100发送出去
我试过串行中断 接收1个便发送1个 好像不可行啊
哪位高人有好办法 就是这种情况:
串口调试助手往MCU发送800个字节,然后再由MCU控制CC1100发送出去,单片机的ram不够,CC1100的发送缓冲区只有64字节
那么单片机该如何接收串口过来的数据、分段发送出去?
我用串行中断接收1个字节便发送1个字节,这样不行,接收端总是只收到1个字节。 如果CC1100的模块不是用中断发送而是查询方式,那么一般的模块连64字节都发不了,他们开发的协议还占用了一些FIFO
一般是发30个字节,等50mS.然后再发。 那单片机如何接收串口过来的很长的数据帧呢?定义一个30字节的数组,接收满30个就执行CC1100发送,但此时串口还有接下来的数据要接收,去执行CC1100发送,那就没法接收接下来的数据了吧 一帧(包),最多 0xff 个字节。
可以分帧(包)发送,CPU 允许的话,可以将发送间隔做的很小。 问题还没解决,我定义了一个30字节的数组,当串口中断接收过来的数据填满数组之后,就设置一个发送标志,然后在主函数中控制cc1100发送出去,然后清掉数组数据,再开中断允许,接收第31-60个子字节,如此循环。。。但这样每次只能接收到前30个字节,会不会是串口数据传输两个字节的间隔时间太小了,当主函数中还在处理前一组数据时,下一个串行中断已经到了。。。
我的问题不是在MCU如何分包,控制CC1100发送
而是在MCU如何接收处理PC发过来的远大于ram区的不定长数据帧(300B~10KB不等)
哪位高人有好的办法? 发送缓冲区和一个接收缓冲区
接收缓冲区满了 移到发送缓冲区(可以简单的修改下地址)串口可以全双工的 边发边接收也没问题 回复【6楼】xivisi LiYong
-----------------------------------------------------------------------
MCU串口接收PC过来的数据,通过SPI总线写到CC1100,只用MCU的接收缓冲区,不用发送缓冲区 让PC每次发30个字节,发完后等待,单片机接收完成用1100发送出去以后给PC一个命令,PC继续发下面30个字节。 回复【8楼】titrwh
-----------------------------------------------------------------------
这个方法是从应用程序上定制一个协议,控制每次发送的字节数,是可行的
但考虑通用性的话,还是想从下位机上寻找一个解决途径 那就把串口波特率降到最低,或许可以。 串口中断一直开着接收到缓冲区(队列) 主程序里不停的发出去要求 SPI发送速度不能比串口慢 回复【10楼】titrwh
-----------------------------------------------------------------------
考虑过,没试过
————————————————————————————————————
谢谢这么多人关注! 要不加一片铁电吧
PS...一回头才知道白说 回复【11楼】xivisi LiYong
串口中断一直开着接收到缓冲区(队列) 主程序里不停的发出去要求 spi发送速度不能比串口慢
-----------------------------------------------------------------------
51支持多进程吗 回复【14楼】dsdh0502
回复【11楼】xivisi liyong
串口中断一直开着接收到缓冲区(队列) 主程序里不停的发出去要求 spi发送速度不能比串口慢
-----------------------------------------------------------------------
51支持多进程吗
-----------------------------------------------------------------------
可以理解为中断就是一个线程 回复【13楼】amazing030
要不加一片铁电吧
-----------------------------------------------------------------------
这个NB,没考虑过,现在市场上的无线数传模块好像都是51、avr等mcu控制,没有其他的外接存储器,不知道他们怎么处理这样问题的,哎,俺没经验啊 回复【15楼】xivisi LiYong
串口中断一直开着接收到缓冲区(队列) 主程序里不停的发出去要求 spi发送速度不能比串口慢
-----------------------------------------------------------------------
51支持多进程吗
-----------------------------------------------------------------------
可以理解为中断就是一个线程
-----------------------------------------------------------------------
不知道怎么编程实现。。。SPI传输的速度是比串口快的多 回复【17楼】dsdh0502
-----------------------------------------------------------------------
缓冲处理:一个字节保存缓冲区数据当前长度,发送一个字节将已有数据全部向前移一位,长度减1,接收到一个字节放在已有数据后面 长度加1
串口处理: 收到一个字节进入中断,把数据放入缓冲区(判断缓冲区是否满,如果未满则按缓冲处理,如果满根据需要决定是否丢弃数据)
SPI处理:如果缓冲区有数据则发送 并等待发送完成或者进入中断, 支持6楼的办法。 回复【18楼】xivisi LiYong
回复【17楼】dsdh0502
-----------------------------------------------------------------------
缓冲处理:一个字节保存缓冲区数据当前长度,发送一个字节将已有数据全部向前移一位,长度减1,接收到一个字节放在已有数据后面 长度加1
串口处理: 收到一个字节进入中断,把数据放入缓冲区(判断缓冲区是否满,如果未满则按缓冲处理,如果满根据需要决定是否丢弃数据)
spi处理:如果缓冲区有数据则发送 并等待发送完成或者进入中断,
-----------------------------------------------------------------------
我之前定义了30字节的缓冲区,当缓冲区满的时候,设置发送标志,然后进行的就是你说的“SPI处理”,不过数据还没处理完,串口下一个中断就到了,导致我每次只接收到前30个字节,后面的字节一概没收到 回复【20楼】dsdh0502
-----------------------------------------------------------------------
不要关中断 也不要等到满了才发只要有数据就发 回复【21楼】xivisi LiYong
回复【20楼】dsdh0502
-----------------------------------------------------------------------
不要关中断 也不要等到满了才发只要有数据就发
-----------------------------------------------------------------------
哦,试试您的方法先,谢过! 试的咋样了 把波特率调低,然后串口接收到就发送给CC1100。试试看。 不要想的那么复杂,给你个方法:
定义一个200(或其他数值)字节的缓冲区接收串口数据,两个指针(或变量)一个指向接收到的最后一字节,一个指向需要发送的第一字节。两个指针之差就是你需要发射的数据字节数。那么:
1、当检测到需要发射的数据大于或等于64,那么立即进行一次RF发射。
2、当检测到需要发射的数据小于64,且有一段时间没有接收到新的串口数据了(比如3ms,5ms,自定),那么认为,来自串口的数据暂时就这些了,无需等到满64个字节。那么,立即将这些数据发射出去。
3、200字节buffer环形缓冲区,两个指针不断同方向游走循环,当Ptr_rx == Ptr_tx时,说明没有需要发射的数据。
长此以往,直到没有需要发射的数据为止。 楼上和我想的一样 叫循环 BUF对吧?
可以想象成一个先入先出的管道 LZ,此法已经屡试不爽了,请照用即可。
仔细计算一下你的串口波特率和RF空中速率、单片机处理时间发射时间等,你可以知道串口和无线信道的带宽之比。假设只用1/3的RF时间即可处理你的串口数据,那么,剩余2/3时间则可以用于处理碰撞、干扰、重发等。你玩的好,合理的算法,可以做到真正的全双工。如果还有剩余带宽,甚至可以实现跳频。
我们曾在项目中用nRF24L01+,就是以此实现全双工通信+4信道跳频。 回复【27楼】liyong110
-----------------------------------------------------------------------
回复【27楼】liyong110
lz,此法已经屡试不爽了,请照用即可。
仔细计算一下你的串口波特率和rf空中速率、单片机处理时间发射时间等,你可以知道串口和无线信道的带宽之比。假设只用1/3的rf时间即可处理你的串口数据,那么,剩余2/3时间则可以用于处理碰撞、干扰、重发等。你玩的好,合理的算法,可以做到真正的全双工。如果还有剩余带宽,甚至可以实现跳频。
我们曾在项目中用nrf24l01+,就是以此实现全双工通信+4信道跳频。
-----------------------------------------------------------------------
也就是说要保证空中速率大于(串口波特率+单片机程序运行时间),才能实现环形buffer存储变量的方法。。? 据说stc89c52有1280字节RAM的 回复【29楼】chess01 =CHESS
据说stc89c52有1280字节ram的
-----------------------------------------------------------------------
stc89c54以上型号才有1280字节ram 那分帧发送了,接收端怎么将接收到的数据组帧?
页:
[1]