pyserial模块接受传感器数据控制台输出
- 首先安装pyserial模块,用pip install pyserial
- 我当时用的传感器有2根线,把他们接在串口调试工具上(一个类似USB的东西,一端连接传感器上面的线,一端连接电脑)
简单的控制台输出(推荐下面有异常处理的代码,此代码只是简介)
import serial
import time
if __name == '__main__':
ser_00 = serial.Serial(port=port, baudrate=ba, timeout=0)
id = 0;
while True:
hex_str = bytes.fromhex(cmd)
ser_00.write(hex_str)
res = ser_00.readall()
temp = res.hex()
print("16进制源数据是:", temp)
"""
d1: 湿度
d2: 温度
d3_1: 土壤湿度一
d3_2: 土壤湿度二 预留位
d4: PM2.5
d5: CO2浓度
d6_1: 气体浓度一
d6_2: 气体浓度二 预留位
d7: 光照强度
"""
d1 = temp[6:10]
d1 = int(d1, 16)
print("10进制数据是:", d1)
print("第%d组数据--湿度:%d 温度:%d 土壤湿度:%d PM2.5:%d CO2浓度:%d 气体浓度:%d 光照强度:%d"
% (id, d1, d2, d3_1, d4, d5, d6_1, d7))
id++;
time.sleep(1)
带异常处理的代码
import serial
import time
if __name == '__main__':
try:
ser_00 = serial.Serial(port=port, baudrate=ba, timeout=0)
id = 0
while True:
hex_str = bytes.fromhex(cmd)
ser_00.write(hex_str)
res = ser_00.readall()
temp = res.hex()
if temp == '':
temp = '0'*46
print("16进制源数据是:", temp)
d1 = temp[6:10]
d1 = int(d1, 16)
print("10进制数据是:", d1)
print("第%d组数据--湿度:%d 温度:%d 土壤湿度:%d PM2.5:%d CO2浓度:%d 气体浓度:%d 光照强度:%d" % (id, d1, d2, d3_1, d4, d5, d6_1, d7))
id++;
time.sleep(1)
except Exception as res:
print('程序出错了:', res)
下面是读出数据并写入Mysql数据库的代码 (水平有限,仅作参考,欢迎指正)
import serial
import time
import pymysql
import re
def show():
print(">>> ------------------------------")
print(">>> ------------------------------")
print(">>> ------欢迎使用串口调试工具------")
print(">>> ------------------------------")
print(">>> ------------------------------")
print(">>> 选项一:调试串口信息,不连接数据库")
print(">>> 选项二:调试串口信息并且连接数据库")
print(">>> ------------------------------")
while True:
opt = input(">>> 请输入你的选项(1/2):")
if opt == '1':
print('>>> 您选择的是---单独调试串口信息,不连接数据库---')
return 1
elif opt == '2':
print('>>> 您选择的是---调试串口信息,并且连接数据库---')
return 2
else:
print('>>> 您输入的选项有误!请重新输入.')
def serial_00(port, ba, cmd, user_select):
if cmd == '':
cmd = '01 03 00 00 00 09 85 cc'
if user_select == 2:
conn = link_mysql()
if conn:
print(">>> 数据库连接成功!")
else:
print(">>> 数据库连接失败!")
return
cur = conn.cursor()
cur.execute('delete from nodedata where 1=1')
try:
port = str(port.upper())
ba = int(ba)
ser_00 = serial.Serial(port=port, baudrate=ba, timeout=0)
ser_00.bytesize = serial.EIGHTBITS
ser_00.stopbits = 1
ser_00.parity = serial.PARITY_NONE
print('>>> 设备打开成功!', '设备端口:', ser_00.port)
print("\n")
id = 0
while True:
hex_str = bytes.fromhex(cmd)
ser_00.write(hex_str)
res = ser_00.readall()
temp = res.hex()
if temp == '':
temp = '0'*46
"""
d1: 湿度
d2: 温度
d3_1: 土壤湿度一
d3_2: 土壤湿度二 预留位
d4: PM2.5
d5: CO2浓度
d6_1: 气体浓度一
d6_2: 气体浓度二 预留位
d7: 光照强度
"""
d1 = temp[6:10]
d1 = int(d1, 16)
d2 = temp[10:14]
d2 = int(d2, 16)
d3_1 = temp[14:18]
d3_1 = int(d3_1, 16)
d4 = temp[22:26]
d4 = int(d4, 16)
d5 = temp[26:30]
d5 = int(d5, 16)
d6_1 = temp[30:34]
d6_1 = int(d6_1, 16)
d7 = temp[38:42]
d7 = int(d7, 16)
if user_select == 2:
sql_word = 'insert into nodedata values(%d, %d, %d, %d, %d, %d, %d, %d, %s)' % (id, d1/10, d2/10, d3_1/10, d4/10, d5/10, d6_1/10, d7/10, ser_00.port)
cur.execute(sql_word)
conn.commit()
print(">>> 源数据是:", temp)
print(">>> 第%d组数据-----湿度:%d 温度:%d 土壤湿度:%d PM2.5:%d CO2浓度:%d 气体浓度:%d 光照强度:%d"
% (id, d1, d2, d3_1, d4, d5, d6_1, d7))
print('\n')
id += 1
time.sleep(1)
except Exception as res:
print('>>> 程序出错了:', res)
def link_mysql():
while True:
sql_ip = input(">>> 请输入目标数据库IP地址(默认localhost):")
if sql_ip == '' or sql_ip == 'localhost':
sql_ip = 'localhost'
break
elif re.match(r'^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$', sql_ip):
break
print(">>> 您输入的IP地址有误,请重新输入!")
while True:
sql_port = input(">>> 请输入目标数据库PORT(默认3306):")
if sql_port == '':
sql_port = 3306
break
if re.match(r'^\d{1,5}$', sql_port):
break
print(">>> 您输入的PORT有误,请重新输入!")
sql_database = input(">>> 请输入目标数据库名称(默认aaa):")
if sql_database == '':
sql_database = 'aaa'
sql_user = input(">>> 请输入数据库用户名(默认bbb):")
if sql_user == '':
sql_user = 'bbb'
while True:
sql_password = input(">>> 请输入数据库密码:")
if sql_password == '':
continue
else:
break
try:
conn = pymysql.connect(host=sql_ip, port=int(sql_port), database=sql_database, user=sql_user, password=sql_password)
return conn
except:
return False
def my_console(opt):
user_select = opt
while True:
com = input(">>> 请输入COM端口号:")
if re.match(r'^com\d+|COM\d+', com):
break
print(">>> 端口号输入错误,请重新输入!")
while True:
bot = input(">>> 请输入波特率:")
if re.match(r'^\d+$', bot):
break
print(">>> 波特率输入错误,请重新输入!")
cmd = input(">>> 请输入指令代码,默认='01 03 00 00 00 09 85 cc':")
serial_00(com, bot, cmd, user_select)
if __name__ == '__main__':
opt = show()
my_console(opt)
希望对各位有所帮助,欢迎评论区交流指正。