2.4G串口透传模块,支持AT命令,时分全双工,全部资料开源
本帖最后由 jk36125 于 2014-7-22 18:00 编辑简介:
无线串口模块wirlessUART是由LGT8F08A和廉价nRF24L01模块制作的无线串口透传模块。能够支持AT命令来配置模块的参数。模块可以配置成“PTX”或者“PRX”的角色。“PTX”和“PRX”的叫法来自nRF24L01的文档,在串口数据传输上,这两种角色并没有差别,但一个PTX设备必须和一个PRX设备配对使用。
主要功能:
1. 最大稳定数据传输波特率115200
2. 可以使用AT命令配置串口的格式,包括波特率,数据长度等等
3. 可以使用AT命令配置无线通信频率,通信速率以及发射功率
4. 时分全双工设计,模块可同时收发数据
5. LED显示模块的配对状态
6. 可以安装锂电池实现自供电
双面感光板,完全Homemade,看起来还不错^_^:
做这个主要是想给树莓派使用,这样就可以无线操作Linux的串口终端。在Linux网络配置还没有完成,或者网络连接失败的时候,无法使用ssh登录linux,需要辛苦的将树莓派重新连接上电视上,再接入一个USB键盘来操作。有了无线串口,就可以悠哉的坐在沙发上,直接使用无线串口终端来配置和恢复Linux,不用跪在角落摆弄布满灰尘的视频传输线。
最初我对模块的要求是,只要能够传输命令行就OK。因为LGT8F08A的SPI接口和串口是复用的,所以只能使用软SPI的方式来连接nRF24L01无线模块。这成为了模块传输速度的主要瓶颈。但实际传输的速度比我最初想象的要快的多,经过几天的测试和调整,程序也变得稳定起来。所以,我测试了模块的连续数据传输能力。
我使用超级终端Zmodem文件发送的方式来测试数据传输。因为模块不包含USB接口,所以测试时将它们分别连接在两个USB转串口设备上,两个USB转串口设备同时连接在一个USB-HUB上。在计算机上使用超级终端打开这两个USB串口,进行文件传输操作。这样,我只需要使用1台计算机就能同时测试数据发送和接收。
测试连接图,两个黑色热缩管包裹着的是USB转串口模块:
经过测试,模块可以在115200波特率下,6到8米距离以内较为稳定的传输文件。传输的距离主要取决于nRF24L01模块的质量以及通信速率(可用AT命令来配置)。在2Mbps的无线速度下,最大直线传输距离在10米左右,如果有墙壁的阻挡,信号衰减的更快。因为选用了最便宜的nRF24L01模块,所以我对传输的距离没有怨言。如果使用带天线的nRF24L01模块,我想传输的距离会更远一些。
模块可以安装锂电池供电,因为有些设备串口部分没有将电源引出来,所以模块自供电使用起来对我比较方便。如果你不需要锂电池,可以去除原理图上标明为SELF-POWERED的部分,焊接EXTERN-POWERED部分。
如何进一步提升传输速度
传输速度的瓶颈在于软件SPI方式连接nRF24L01模块。这是因为LGT8F08A的SPI接口和UART接口是复用的。所以,换用有硬件SPI可用的AVR芯片上,相信可以进一步提升传输速度和稳定性。LGT和AVR的之间的移植也不是很困难。但AVR的价格比LGT要贵的多。
使用说明:
在上电时按住AT-MODE键不放可以进入AT命令模式,在这个模式下可以设置模块的各种参数。
红色LED为电池信号:低电量时会开始闪烁,充电时为常亮。
蓝色LED为PTX设备连接信号(PRX设备不使用):连接成功时为常量,搜索设备时为闪烁。
必须使用一个PTX设备和一个PRX设备配对使用。并且两个设备的无线频率和无线速率必须相同。
硬件原理图:
PDF格式:
软件源代码:
二进制文件:
AT命令说明:
显示所有配置:AT+WHAT?
显示设备角色:AT+ROLE?
显示串口格式:AT+UART?
显示无线频率:AT+RFCH?
显示无线速率:AT+RFDR?
显示无线功率:AT+RFPW?
设置设备角色:AT+ROLE=PRX 或者 AT+ROLE=PTX
设置串口格式:AT+UART=115200,N,8,1 或者 AT+UART=9600,O,8,1 或者 AT+UART=4800,E,9,2
设置无线频率:AT+RFCH=2(频率为2400+2Mhz)或者 AT+RFCH=10(频率为2400+10Mhz)
设置无线速率:AT+RFDR=1M 或者 AT+RFDR=2M
设置无线功率:AT+RFPW=0(最小)或者 AT+RFPW=3(最大)
DIY成本计算:
LGT8F08A-SSOP24 1.85元
nRF24L01模块 4.00元
阻容插座开关LED 2.00元(大约)
感光板PCB 2.00元(大约)
合计:9.85元
增加锂电池:
KB4540(2YL1) 1.20元
140mAh锂电池 8.00元
合计:9.2元 占个沙发,好东西 楼主能说说是怎样实现全双工的吗?
一般24L01是用ACK机制来实现双工通讯。但这个就要求在TX端空闲的时候,也要有数据传输才行。 精彩,谢谢楼主的分析,楼主大侠能给我们讲一下程序的大概流程不,就是串口队列、如何实现缓存等流程。 好东西,收藏表示感谢! 确实不错,模块看上去简单好用。 无线串口,记录。谢谢LZ mark 顶顶更健康 时分全双工
难道是收发不停切换 mark......... 解释一下时分全双工的原理。
时分全双工,就是TX和RX线路的数据各占用一半的传输时间和传输带宽。
要做到这一点,首先要启用nRF24L01的“ack with payload”功能。PTX设备发送数据以后,PRX设备返回的ACK中,也可以附加上32字节的数据。
如果PTX设备没有数据要发送,就发送空数据包轮询PRX设备。
这样,在满负载传输的时候,就是:
PTX发送32字节数据 -> PRX发送ACK和32字节数据 -> PTX发送32字节数据 ~ etc
TX数据和RX数据相当于各占用了一半的传输带宽。
由于nRF24L01硬件上有32字节FIFO,并且LGT8F08A上开辟了64字节的缓存,所以从串口的角度来看,可以认为是全双工传输。
以上是理论,以下是实际。{:smile:}
实际测试的结果是,数据全双工满负荷传送的时候,还是会出现丢失数据的情况{:sad:}。
这是因为使用了软件SPI传输数据的关系。如果有硬件SPI可用,我想nRF24L01或许可以做到230400全双工传输。 要做到这一点,首先要启用nRF24L01的“ack with payload”功能。PTX设备发送数据以后,PRX设备返回的ACK中,也可以附加上32字节的数据。
如果PTX设备没有数据要发送,就发送空数据包轮询PRX设备。
这样,在满负载传输的时候,就是:
PTX发送32字节数据 -> PRX发送ACK和32字节数据 -> PTX发送32字节数据 ~ etc
TX数据和RX数据相当于各占用了一半的传输带宽。
请问LZ 如果你的 PRX发送ACK和32字节数据 数据传输中数据丢了怎么办?nRF24L01的“ack with payload”功能是否把数据当成 AUTO ACK信号? 这样是否PRX 就没有了自动重发功能? 不错!加功放!!!!{:titter:}{:titter:}{:titter:} waterghost 发表于 2014-7-23 09:55
要做到这一点,首先要启用nRF24L01的“ack with payload”功能。PTX设备发送数据以后,PRX设备返回的ACK中 ...
数据的重发和效验都是由nRF24L01自动完成的,只要设置重发次数和间隔时间,其它的不需要MCU干预。 好东西啊,我自己做的那个怎么也不能传输大的数据,一传输大数据就死机了。
这个是个标准长度的尾巴,你能看到这个尾巴说明你的浏览器是正常的。欢迎光临我的淘宝店。 jk36125 发表于 2014-7-23 10:13
数据的重发和效验都是由nRF24L01自动完成的,只要设置重发次数和间隔时间,其它的不需要MCU干预。 ...
文件传输对数据完整性要求很高,不干预是不行的。除非是做玩具遥控,周期性发送同样的上下左右油门数据,偶尔丢包无所谓……
PTX发送数据可以保证很高的可靠性,因为有CRC16和ACK
PRX携带在ACK帧Payload的数据则没法保证。
分析过程如下。正常无干扰:
1-PRX预先填充数据B1到Payload
2-PTX发送一包数据A1
3-PRX收到A1,硬件自动发出之前准备好的Payload数据B1,然后产生中断
4-PRX的MCU处理中断,填充下下一包数据B2到Payload
5-PTX发送下一包数据A2
……
有干扰时,分为两种情况:
1-PTX发送数据过程受干扰,导致PRX没有收到完整数据包,自然也没有自动ACK
——此时PTX会自动重发,能解决掉大部分问题
——如果PTX重发次数满了还是没有成功,这需要MCU介入,重发数据
2-PRX收到完整数据包,但是在自动发送ACK过程受到干扰,导致PTX没有收到完整ACK(PRX已经认为发送成功了,扔掉数据,马上准备下一包数据),所以PTX会自动重发……
——结果就是PRX可能收到多余的数据;PTX丢掉了数据
在实际应用环境(有多个同类2.4G设备,还有WLAN),干扰情况2的概率还是挺大的。
所以我们没有用满32字节Payload,而是参考TCP协议,留出一些作为双方状态指示,每次双方都交换状态,这样PRX会一直查询状态,直到确认PTX已经正确收到ACK,才会准备下一帧数据,确保不会丢数据;PTX也会不停查询PRX状态,直到确认PRX收到了数据,确保不会多发送数据。
坏处就是通信速率降低一半 来学习的 好强大,记号一个 无线通信是个热门应用,值得深入研究。 mmmmmmmmmmmark!{:biggrin:} 这个很有参考价值 好东西,值得研究 好东西,感谢楼主共享。
不用找10块钱的蓝牙串口了 mhw 发表于 2014-7-23 19:26
文件传输对数据完整性要求很高,不干预是不行的。除非是做玩具遥控,周期性发送同样的上下左右油门数据, ...
你说的数据丢失问题,我觉得放在文件传输协议上来解决,比放在传输驱动层上或许更合适一些。
举个实际的例子,我曾经使用超级终端的“Zmodem崩溃于恢复”,通过无线串口来传输文件(这好像也是串口传输文件仅有的几个可怜用处),然后慢慢的在传输的过程中拉远接收双方的距离。
距离增大到一定程度的时候,开始出现丢包现象。距离继续增大以后,出现了非常严重的丢包。
但是文件最后还是传输成功了。
因为Zmodem协议已经处理了发生丢包的情况。所以无线模块只需要发送和接收数据就好了。 {:victory:}{:victory:}{:victory:} 强,谢谢楼主了 jk36125 发表于 2014-7-24 09:26
你说的数据丢失问题,我觉得放在文件传输协议上来解决,比放在传输驱动层上或许更合适一些。
举个实际的 ...
看来应用场合不一样……
用到我们那种透传模块的,都是一些低端的8位甚至4位单片机,不会有复杂的应用层协议,所以要求我们传输层提供可靠的信道,也就是串口发个包,要求必须可靠到达对端,反之亦然。 mhw 发表于 2014-7-24 12:27
看来应用场合不一样……
用到我们那种透传模块的,都是一些低端的8位甚至4位单片机,不会有复杂的应用层 ...
你该叫他们换好一点的单片机{:lol:}
我一直认为,数据都如果飞到空中了,飞进谁的鼻孔都不是没有可能,100%到达只能是一种美好的愿望,就像路飞的onepiece。 jk36125 发表于 2014-7-24 13:57
你该叫他们换好一点的单片机
我一直认为,数据都如果飞到空中了,飞进谁的鼻孔都不是没有可能, ...
传输层软件做好了,上位机几毛钱的OTP单片机都会比你的简单传输层+电脑强……因为消费品周边环境比较恶劣,有的信道被干扰了,应用层怎么重传都没用的……要靠透传模块自身的载波侦听+自动跳频来解决 楼主有中文注释的程序吗?想移植到stm8s103f3p6上(用硬件spi控制24l01没问题),代码看不懂啊,主函数里带usb的程序都用不到吧?突然感觉自己c语言没学好啊。 顶起,很不错 好东西,必须顶! 记号,收藏 大赞!完全开源。 请问楼主那个晶振用的32768? 原理图上看是16M吧 占沙发,顶一个 真的很感谢楼主的分享!参考价值不错! 用LGT8F88A内部RC能跑到32M。SPI接口和串口分开的 不错啊,不知用来做成无线下载程序的功能行不行。 记号,顶一个。 厉害~·有个性 好东西~厉害~·有个性 顶一个,学习了!! 谢楼主{:smile:} {:smile:} {:smile:} 這真是太方便了. " 数据的重发和效验都是由nRF24L01自动完成的,只要设置重发次数和间隔时间,其它的不需要MCU干预。" 不错的设计 mark joystring 发表于 2014-7-22 18:06
占个沙发,好东西
问遍了宝上卖家,都没有全双工的。
其实原来通过USB--TTL 全双工调试,PLC 下载程序有 很多是需要全双工的,要求应答的实时性特别好,
楼主的这个可以满足这种要求? 改天做个wifi透传 待我有时间改成STM8的{:lol:} 支持啊........不错............ 长期潜水员,躺枪了,努力发帖升级 设计不错,谢谢 好强大,赞一个先 好东西,谢了 楼主,你的AT指令跑在LGT8F08A这个单片机里面了吗 Mark 看下 好东西,感谢楼主分享。。。 armstrong 发表于 2014-7-23 21:56
无线通信是个热门应用,值得深入研究。
亲,你这头像是哪部片的啊,看得我都醉了 看着不错,有时间研究。 不错,有时间也跟着试一下 顶 感谢楼主分享! 厉害 那个塑料是用来防静电怕烧了无线模块的么? 借鉴一下,感谢楼主 收到了感谢楼主 好资料收藏了,{:lol:} mark 收藏!! 不错,做的挺认真的 谢谢分享................ 楼主好人啊,感谢分享! mark一个 谢谢分享,学习 谢谢楼主分享,牛人啊! 不错,仿制一个玩玩! 标记 真不错,自己做了好几天才到30K感谢分享! 有没有人测试过不加天线,这个模块能传多远? 不错,下下来好好看看先 好,谢了。{:lol:} 太好了,有空仿制一个 用的什么开发环境? 这个这的很不错,支持一下
页:
[1]