OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 21522|回复: 14

分享个简单的串口-无线数据转发程序

[复制链接]

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
发表于 2012-5-20 22:04:24 | 显示全部楼层 |阅读模式
用的无线模块是nrf24l01,
驱动程序直接用原子的例程,

实现的功能是:
如果从串口接收到 32 个字节,就把数据通过无线模块发送出去
如果从无线模块接收到32个字节,就把数据通过串口发给电脑,
如果200ms内缓冲区的大小不是32个字节也不是空,会清空缓冲区。

我用了两块 ALIENTEK Mini 板来做这个实验,效果见图:


是这样的:
电脑通过串口发送数据到 Mini 板 1,然后Mini 板 1 就通过无线模块把数据发送到 Mini 板 2,Mini 板 2 接收到数据后又把数据返回给上位机。

一次32个字节跟无线模块有关,也跟我最近做的鸟东西的自己规定的通信协议有关。。。不解释了。。。
对无线模块不太了解。。。没研究。。。纯粹是应用原子哥提供的驱动代码。。。

stm32_cppTest-无线-串口数据转发.zip

2.24 MB, 下载次数: 2555

https://github.com/roxma
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
 楼主| 发表于 2012-5-20 22:30:22 | 显示全部楼层
突然发现个隐患。。。这段代码
while(1) {
if(textInFIFO.GetCurSize()==32) // 检查有无接收到数据,如果有,就进行处理
{
green = !green; // 有数据传输,翻转绿灯示意
for(int i=0; i<32; i++) // 读缓冲区
textInFIFO>>buffer;
timer2.Counter(DISABLE); // 关闭超时计数
timer2.SetCounter(0); // 清零计数器
WirelessWaitReady();
TX_Mode(); // 配置为发送模式
NRF24L01_TxPacket((u8*)buffer);
RX_Mode(); // 配置回接收模式
}
else if(!textInFIFO.IsEmpty()){// 如果缓冲区中有内容,启动超时计数
timer2.Counter(ENABLE);
}
                ....
}

应该改成:

while(1) {
if(textInFIFO.GetCurSize()==32) // 检查有无接收到数据,如果有,就进行处理
{
timer2.Counter(DISABLE); // 关闭超时计数
timer2.SetCounter(0); // 清零计数器
if(textInFIFO.GetCurSize()==32) { // 重新验证
green = !green; // 有数据传输,翻转绿灯示意
for(int i=0; i<32; i++) // 读缓冲区
textInFIFO>>buffer;
WirelessWaitReady();
TX_Mode(); // 配置为发送模式
NRF24L01_TxPacket((u8*)buffer);
RX_Mode(); // 配置回接收模式
}
}

和中断共享的变量要小心。。。虽然这些情况几乎是不可能发生的。。。
https://github.com/roxma
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-5-21 01:04:11 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
 楼主| 发表于 2012-5-21 02:38:05 | 显示全部楼层
回来审视一下代码,发现可能不大好懂。。。
估计是因为上面的一个fifo对象是以前写过的,
直接用了现成的代码,所以我才觉得这个功能写起来就简单了。。。
https://github.com/roxma
回复 支持 反对

使用道具 举报

22

主题

107

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
215
金钱
215
注册时间
2012-4-17
在线时间
0 小时
发表于 2012-6-8 21:46:52 | 显示全部楼层
lz威武 ,谢谢分享
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
 楼主| 发表于 2012-7-28 15:45:49 | 显示全部楼层

再上个程序,这次实验需要3个mini板,实现无线下载STM32!!!
这个程序以前也调过,但是没试出来,后来就放弃了。前几天实验室的师兄买了个蓝牙转串口模块,试了一下午调出来了,才知道下载的时候软件用的是偶校验的。
然后就改了一下程序,
两个mini板和另一个STM32的连接方式是:
电脑----------(平常下载用的USB线)------------mini板1-----------24L01模块
24L01模块------------mini板2-----------------通过STM32的串口-------------------第三个STM32
(两个mini板都先烧好我上传的代码)

然后,下载的波特率设置成115200,当然也可以设置成其它波特率,但是需要改程序。
配置好第三个STM32的B0,B1后,按下复位,
在点击MCUISP软件的下载按钮,就可以下载了!!!(注意下载软件不要使用RTS和DTR)

速度还挺给力的,比那天用的蓝牙快上许多
现在的使用还不是很方便,但是这个意义是比较大的,我以后还打算对它进行很多完善的!
 之前参加的一个比赛,在苦逼的调试小车的过程中我们就提出了无线下载的想法,今天终于解决了这个问题!!!真是欢乐呀!

stm32_cppTest-无线-串口数据转发(可以用来无线下载STM32).zip

5.88 MB, 下载次数: 1519

https://github.com/roxma
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-28 16:01:26 | 显示全部楼层
呵呵,不错.
可以考虑IAP啊,直接解决.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
 楼主| 发表于 2012-7-28 16:08:28 | 显示全部楼层
IAP是什么?

以前调小车的时候是外部供电的,在跑道上跑了一会,更新程序以后又得把车从跑道拿回来,下载程序,感觉挺麻烦的,所以后来才想到用无线下载的。
https://github.com/roxma
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2012-7-28 18:54:57 | 显示全部楼层
就是在应用编程.
首先你在小车单片机上运行一个bootloader程序,让这个bootloader支持无线下载,然后再下载应用程序,就可以下载了,从而实现无线更新代码.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
 楼主| 发表于 2012-7-28 20:00:10 | 显示全部楼层
这样的话上位机软件也得改吧,感觉有点复杂,如果可以直接无线转串口的话会省去不少工作,直接兼容现有的串口ISP软件和串口调试助手,通用性更好些
在没试出来之前有想过自己写个ISP软件,呵呵,现在不用了,工作量还是比较少的,上面的那个代码是一个月前就花一个晚上写好的,不过要做得好的话还是得花不少功夫
打算过段时间把功能做得更完美一些,单独做些模块出来
https://github.com/roxma
回复 支持 反对

使用道具 举报

27

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2011-11-2
在线时间
11 小时
发表于 2012-7-29 12:05:01 | 显示全部楼层
桌面威武啊
回复 支持 反对

使用道具 举报

0

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2013-3-1
在线时间
6 小时
发表于 2013-8-8 11:09:32 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
原子哥,我也早已有用无线烧程序的想法,请问可以用UTC1212无线下程序吗?无线烧程序的关键在哪里?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-8 11:24:17 | 显示全部楼层
回复【12楼】我爱单片机:
---------------------------------
关键在无线数据的可靠传输.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-8-17 13:29:18 | 显示全部楼层
唉 有钱啊 我只有一块mini板没法做实验啊 难道要用我的arduino板来做
业余程序玩家。
回复 支持 反对

使用道具 举报

36

主题

1105

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2201
金钱
2201
注册时间
2012-2-8
在线时间
35 小时
 楼主| 发表于 2013-8-17 17:53:54 | 显示全部楼层
回复【14楼】ofourme:
---------------------------------
另一个是借同学滴
https://github.com/roxma
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-14 23:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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