12532|1

15

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【树莓派3B+测评】与8266通信 [复制链接]

本帖最后由 icefire2012 于 2018-10-7 19:01 编辑

        这一篇是树莓派与ESP8266的通信。
        简单的示意图如下:

        手机作为AP,树莓派和ESP8266分别连接到该热点上。这里ESP8266用的是官方的模组,需要外部MCU通过串口发送AT指令控制。那这个MCU就由树莓派代劳了。树莓派和ESP8266之间建立TCP连接,树莓派作为服务器,ESP8266作为客户端。本质就是树莓派自己在这绕着圈子自言自语,呵呵。

一、准备工作
        手机建立AP热点,名称为:AP01,密码为12345678

        树莓派和ESP8266之间需要四根连线。分别是3.3V电源,GND,以及串口的tx和rx。ESP8266所需的电源从树莓派上获取。之前提到过,树莓派的IO扩展口中有路UART,如下图所示。根据树莓派官方的资料,树莓派3B+上的串口控制器默认是分配给了蓝牙,这里要用串口,需要更改配置,将串口分配到IO扩展口上。具体的方法网上有不少,我是参照这个网页上的教程来设置的(http://shumeipai.nxez.com/2016/0 ... art-use-issues.html)。注意:该网页内容中“编辑/boot目录下的cmdline.txt文件”一步我跳过了。因网页下面有留言更改后无法启动,所以我跳过了(我自己的猜测而已,没有证实)。跳过不影响本实验。  
            

        测试的时候,还是用的python编程,这里需要先安装一下python下的串口模块。我之前做蓝牙时,串口模块已经被安装上了,这里还是贴一下安装命令:
  1. sudo pip install pyserial
复制代码

或者
  1. sudo pip3 install pyserial
复制代码


二、测试代码
        先将测试代码贴在这里
  1. import os
  2. import time
  3. from multiprocessing import Process
  4. import serial
  5. import socketserver

  6. #TCP Server
  7. class Myserver(socketserver.BaseRequestHandler):
  8.     def handle(self):
  9.         conn = self.request
  10.         while True:
  11.             uclient_dat=conn.recv(1024)
  12.             print('rcv from 8266:%s' %(str(uclient_dat,'utf8')))
  13.             if(uclient_dat==bytes('liang ge huang li ming cui liu','utf8')):
  14.                 conn.sendall(bytes('yi hang bai lu shang qing tian','utf8'))
  15.             else:
  16.                 conn.sendall(bytes("I don't know",'utf8'))

  17. def tcpServer(name):
  18.     print('%s start...' %name)
  19.     userver=socketserver.ThreadingTCPServer(('192.168.43.125',8200),Myserver)
  20.     userver.serve_forever()

  21. #TCP Client
  22. def getRSP(ser):
  23.     size=ser.inWaiting()
  24.     sbuf=ser.read(size)
  25.     print(sbuf)

  26. #1 set to station mode
  27. #2 set ssid
  28. #3 chek ip addr
  29. #4 creat socket
  30. param=('AT+CWMODE_CUR=1\r\n',
  31.        'AT+CWJAP_CUR="AP01","12345678"\r\n',
  32.        'AT+CIPSTA?\r\n',
  33.        'AT+CIPSTART="TCP","192.168.43.125",8200\r\n')

  34. def tcpClient8266(name):
  35.     print('%s start...' %name)
  36.     ser=serial.Serial("/dev/ttyAMA0",115200)
  37.     for prm in param:
  38.         ser.write(prm.encode())                                
  39.         time.sleep(8)
  40.         getRSP(ser)
  41.     dat_tx='liang ge huang li ming cui liu'
  42.     print(len(dat_tx))
  43.     while True:
  44.         ser.write('AT+CIPSENDEX=30\r\n'.encode())      
  45.         time.sleep(1)
  46.         getRSP(ser)
  47.         ser.write(dat_tx.encode())      
  48.         time.sleep(1)
  49.         getRSP(ser)

  50. if __name__=='__main__':
  51.     p1=Process(target=tcpServer,args=('tcpServer',))
  52.     p2=Process(target=tcpClient8266,args=('tcpClient8266',))
  53.     p1.start()
  54.     p2.start()
  55.     while True:
  56.         pass
复制代码


三、简要说明
        测试程序启动后,建立了两个进程,tcpServer和tcpClient8266,并分别启动,见代码57-60行。
        进程tcpServer的代码在8-22行,建立的server的ip为192.168.43.125(也就是树莓派的IP),socket端口为8200。此server只做一件事,接收客户端的数据,如果收到的为汉语拼音“两个黄鹂鸣翠柳”,则回复汉语拼音“一行白鹭上青天”,否则回复“I don't know”。
        进程tcpClient8266的代码在25-54行。首先打开串口(line41),串口设备为/dev/ttyAMA0,使用的波特率为115200,其它都用默认配置。然后通过串口发送AT指令配置8266模块。配置的参数param一共有四个,第一个是设置8266为station模式;第二个是设置要连接的热点名称和密码;第三个是获取8266分配到的网络配置信息,包括IP地址,子网掩码,网关等;第四个是建立tcp连接,服务器地址和socket端口就是tcpServer进程中设置的信息。每发送一个配置信息,都会等待8266完成配置,并接收8266返回的配置信息,并打印出来(通过getRSP()函数)。每条配置信息完成的时间不尽相同,这里没有去解析回复信息,简单起见,都做了一个比较长的延时(line44)。建立连接后,就可以通信了。48-54行是在循环发送汉语拼音“两个黄鹂鸣翠柳”,并接收服务器传回来的信息。
最终的演示效果如下:

        手机上的连接示意图如下:第一个是树莓派,第二个是8266,第三个是开发PC机。


四、结语
        在这个例子里,树莓派一方面构建一个web服务器,另外一方面,可以直接挂载其它的物联网模块,这里是用串口和连接了wifi模块,也可以连接433或zigbee模块。如果进一步拓展功能,就能成为一个功能丰富的物联网网关,管理众多的物联网节点。也可以通过IO扩张上的I2C以及SPI接口也可以直接挂载传感器模块获取相应的传感器数据。后续将继续在这方面拓展做一些有意思的小应用。

此帖出自单片机论坛
点赞 关注
 

回复
举报

15

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
本帖最后由 icefire2012 于 2018-10-7 19:20 编辑

        如果一直要使用蓝牙功能,或者不想麻烦修改uart的映射关系,也可以通过加一个usb转串口工具来实现串口通信。树莓派3B+上有四个USB口。我现在用putty远程访问操作树莓派,这四个USB口都空着呢。我用了一个USB转串口模块,主芯片是CH340C,而且带+5V和+3.3V电源输出,可以通过该3.3V电源给8266供电。CH340方案的USB转串口模块插到树莓派上系统可自动识别,不需要安装驱动。
        将USB转串口模块插到树莓派上后,用命令查看一下当前的设备情况。
  1. ls -l /dev
复制代码


        可以看到识别出来的设备名称为ttyUSB0。另外需要更改一下测试代码,将第41行中的"/dev/ttyAMA0"更改为"/dev/ttyUSB0"即可。

此帖出自单片机论坛
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
报名最后2天:ADI 最新低功耗 MCU 及其解决方案详解
直播时间:3月20日(本周四) 上午10:00
活动奖励:双肩包、充电宝、小夜灯

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 3

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表