这次介绍一下,如何从传感器获得数据,并存入本地数据库中,
推介一个简易版:https://blog.csdn.net/qq_43433255/article/details/86985964
在这里首先,要感谢我的老师—蒋老师,因为,他提供了传感器的连接,让我顺利完成这次实验。也在蒋老师的指导下,知道一套完整的流程走向:
需要连接传感器,现在的笔记本一般没有端口,所以用的是虚拟端口;用传感器获得数据,将传感器获得数据存入本地数据库;通过另外的一个程序,将本地的数据库中数据传入一个服务器中(这个步骤没有完成,如果完成了,我会记得更新的)
安装mysql可以参考我这一个博客:
https://blog.csdn.net/qq_43433255/article/details/86076126
现在的笔记本电脑,一般没有串口,采用虚拟串口;
先来展示一下实验效果:
数据库中内容:
接下来是代码部分:
先来实验两个串口间的相互通信:
串口1代码:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
u'''
Created on 2018年12月27日
@author: wuluo
'''
__author__ = 'wuluo'
__version__ = '1.0.0'
__company__ = u'重庆交大'
__updated__ = '2018-12-27'
import serial
# 打开串口
serialPort = "COM1" # 串口
baudRate = 9600 # 波特率
ser =serial.Serial(serialPort, baudRate, timeout=0.5)
print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))
# 收发数据
while 1:
str = input("请输入要发送的数据(非中文)并同时接收数据: ")
ser.write((str + '\n').encode())
print(ser.readline()) # 可以接收中文
ser.close()
if __name__ == "__main__":
pass
串口2的代码:
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
u'''
Created on2018年12月27日
@author: wuluo
'''
__author__ = 'wuluo'
__version__ = '1.0.0'
__company__ = u'重庆交大'
__updated__ = '2018-12-27'
import serial
# 打开串口
serialPort = "COM2" # 串口
baudRate = 9600 # 波特率
ser =serial.Serial(serialPort, baudRate, timeout=0.5)
print("参数设置:串口=%s ,波特率=%d" % (serialPort, baudRate))
# 收发数据
while 1:
str = input("请输入要发送的数据(非中文)并同时接收数据: ")
ser.write((str + '\n').encode())
print(ser.readline()) # 可以接收中文
ser.close()
if __name__ == "__main__":
pass
实验结果:
下面,介绍,如何通过一个串口,将传感器得到的数据传回到本地数据库,
准备一个数据库,我采用的是mysql,具体安装教程,以及相关的问题,上面有链接,
数据库的创建语言:
create table wensidu(
id varchar(50 ),
wendu varchar(50),
sidu varchar(50),
primary key(id)
)
然后就是两个串口部分的代码:
The one:
#!/usr/bin/env
python3
# -*-
coding:utf-8 -*-
u'''
Created on 2019年1月6日
@author:
wuluo
'''
__author__
= 'wuluo'
__version__
= '1.0.0'
__company__
= u'重庆交大'
__updated__
= '2019-01-11'
import threading
import time
import jpyc.jserial as jserial
import socket
import codecs
import pymysql
#
mysql数据库的连接
con =
pymysql.connect(
host='127.0.0.1',
port=3306,
user='root',
password='123456',
db='python_wensidu',
charset='utf8'
)
cur =
con.cursor() # 定义一个游标,通过游标来操作数据库
class U2S():
def __init__(self, us_address, s_para):
self.isalive = True
self.us_address
= us_address
self.s_para = s_para
self.serial = jserial.JSerial()
self.serial.setsettings(s_para)
self.serial.open()
self.udp =
socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.udp.setsockopt(socket.SOL_SOCKET,
socket.SO_REUSEADDR,
1)
self.udp.settimeout(5)
self.th =
threading.Thread(target=self.recvfromserial, args=())
self.th.setDaemon(True)
self.th.start()
self.th_udp =
threading.Thread(target=self.recvfromudp, args=())
self.th_udp.setDaemon(True)
self.th_udp.start()
def __del__(self):
self.serial.close()
self.udp.close()
def recvfromudp(self):
while self.isalive:
try:
data, addr = self.udp.recvfrom(8192)
data = codecs.encode(data, 'hex')
r = bytes(data).decode('utf-8')
# 解码
shidu = int(r[6:10], 16) / 100
wendu = int(r[10:14], 16) / 100
localtimes = time.strftime(
"%Y-%m-%d %H:%M:%S", time.localtime())
print(localtimes)
print("温度:%s,湿度:%s\n" % (wendu, shidu))
cur.executemany("INSERT wensidu
VALUE(%s,%s,%s)", [
(localtimes,
str(wendu), str(shidu))]) # int转str
con.commit()
print("---------显示数据库内容------------")
#===读取数据库
select = cur.execute('SELECT * FROM wensidu')
all = cur.fetchall()
print(all)
except socket.timeout:
pass
def quit(self):
self.isalive = False
def recvfromserial(self):
while self.isalive:
data = self.serial.recv()
if not data:
continue
print('从串口接收到:%s' % data)
self.udp.sendto(data, self.us_address)
if __name__ == "__main__":
u2s = U2S(('10.1.156.82', 8001), 'com1,9600,8,N,1')
try:
while u2s.th.is_alive():
time.sleep(1)
finally:
if u2s.th.is_alive():
u2s.quit()
The two:
#!/usr/bin/env
python3
# -*-
coding:utf-8 -*-
u'''
Created on 2019年1月6日
@author:
wuluo
'''
__author__
= 'wuluo'
__version__
= '1.0.0'
__company__
= u'重庆交大'
__updated__
= '2019-01-08'
import serial
import codecs
import time
import datetime
if __name__ == "__main__":
while True:
com = serial.Serial()
com.port = 'com2'
com.baudrate = 9600
com.bytesize = 8
com.stopbits = 1
com.parity = 'N'
com.timeout = 5
com.open()
cmd = b'030300000002c5e9'
cmd = codecs.decode(cmd, encoding='hex')
try:
com.write(cmd)
data = com.read(9)
shijian = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
print(shijian)
print('接收到:%s' % codecs.encode(data, encoding='hex'))
except:
print('超时')
finally:
com.close()
到此,传感器的数据传入本地数据库中,已经完成了,
原理其实非常简单,也可以用十分简单的代码做完,其简易版,也会补充上;
还要完成的工作是,将本地数据库中数据,传入一个云端数据库,也就是一个远程数据库;
这时,就必须考虑数据库中值是否合理,在传送值时,考虑是波动范围之类的,
如果后面,我完成相应的代码,会补充近来,
当然,有想法的朋友,也可以与我联系,或者自己进行补充。