(可以运行)python串口调试工具pyserial读取传感器数据并写入Mysql数据库

pyserial模块接受传感器数据控制台输出

  • 首先安装pyserial模块,用pip install pyserial
  • 我当时用的传感器有2根线,把他们接在串口调试工具上(一个类似USB的东西,一端连接传感器上面的线,一端连接电脑)

简单的控制台输出(推荐下面有异常处理的代码,此代码只是简介)

# 导包的名字和模块名字不同,不用纠结,问题不大
import serial
# 让控制台打印延时,不然打印太快了,看不清
import time

if __name == '__main__':
	# 打开端口
	# port:端口号,windows用户在控制面板设备管理器中查看是COM?(如COM3)
	# baudrate:波特率,传感器不同波特率不同,传感器的说明书上有,我当时用的是9600
	# timeout:超时设置
	# 其他参数我没去试,不过只要设置上面3个参数就能接受数据了,其他想了解的可以百度pyserial具体参数
	ser_00 = serial.Serial(port=port, baudrate=ba, timeout=0)  
	
	id = 0# 第几组数据,方便查看
	
	# 不停给传感器发送指令,传感器不同指令不同,我当时的指令(16进制)是:01 03 00 00 00 09 85 cc
	while True:    
            hex_str = bytes.fromhex(cmd)  # 把字符串转化为16进制 cmd= "01 03 00 00 00 09 85 cc"
            ser_00.write(hex_str)  # 发送指令给传感器			
            
            res = ser_00.readall()  # 读取数据

            temp = res.hex()  # 源数据---把读取的数据转换为16进制,转换后的类型时间长我也忘记了,望谅解

            print("16进制源数据是:", temp) # 输出是16进制的

			# 下面是转换成10进制显示
			# 重点:传感器读取的数据temp每x位代表的意思不同,看传感器的说明书
			# 比如我的传感器就是每4个16进制数代表一个数据,如湿度是temp[6:10] 左闭右开所以是6789,然后再转换成10进制 int(temp[6:10], 16)

			"""
            d1:   湿度
            d2:   温度
            d3_1: 土壤湿度一
            d3_2: 土壤湿度二 预留位
            d4:   PM2.5
            d5:   CO2浓度
            d6_1: 气体浓度一
            d6_2: 气体浓度二 预留位
            d7:   光照强度
            """
        
            d1 = temp[6:10]  # d1 6-9左闭右开
            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) # 延时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() 
					
				# 此步为了防止读不出数据使得下面temp切分时出错
	            if temp == '':
                	temp = '0'*46 # 我那个传感器读取的数据一共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) # 延时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')
	#  如果存在nodedata的数据就删除所有数据
    # cur.execute('drop table if exists nodedata')
    # create_table = """create table nodedata(id int primary key, d1 int, d2 int, d3 int, d4 int, d5 int, d6 int, d7 int)"""
    # cur.execute(create_table)
  
    try:
        port = str(port.upper())
        ba = int(ba)
        ser_00 = serial.Serial(port=port, baudrate=ba, timeout=0)  # 打开端口

        ser_00.bytesize = serial.EIGHTBITS  # 8bit
        ser_00.stopbits = 1  # stopbits
        ser_00.parity = serial.PARITY_NONE  # 无校验

        print('>>>   设备打开成功!', '设备端口:', ser_00.port)  # 设备名称,端口号
        print("\n")

        id = 0  # 数据标记,第几组数据

        while True:    
            hex_str = bytes.fromhex(cmd)  # 把字符串转化为16进制
            ser_00.write(hex_str)
            
            res = ser_00.readall()  # 读取数据

            temp = res.hex()  # 源数据---把读取的数据转换为16进制

            if temp == '':
                temp = '0'*46

            """
            d1:   湿度
            d2:   温度
            d3_1: 土壤湿度一
            d3_2: 土壤湿度二 预留位
            d4:   PM2.5
            d5:   CO2浓度
            d6_1: 气体浓度一
            d6_2: 气体浓度二 预留位
            d7:   光照强度
            """
            # 需要用到的只有d1  2  7
            d1 = temp[6:10]  # d1      6-9左闭右开
            d1 = int(d1, 16)

            d2 = temp[10:14]  # d2
            d2 = int(d2, 16)

            d3_1 = temp[14:18]  # d3_1
            d3_1 = int(d3_1, 16)

            # d3_2 = temp[18:22]  # d3_2

            d4 = temp[22:26]  # d4
            d4 = int(d4, 16)

            d5 = temp[26:30]  # d5
            d5 = int(d5, 16)

            d6_1 = temp[30:34]  # d6
            d6_1 = int(d6_1, 16)

            # d6_2 = temp[34:38]  # d6_2

            d7 = temp[38:42]  # d7
            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)  # 延时1秒,在实际运行的时候取消延时,延时只为了调试方便

    except Exception as res:
        print('>>>   程序出错了:', res)


def link_mysql():  # d1, d2, d3_1, d4, d5, d6_1, d7

    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

    # print(sql_ip, sql_port, sql_user, sql_password, sql_database) 测试用

    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=1/2 1:仅调试 2:连接数据库
    opt = show()
    my_console(opt)

希望对各位有所帮助,欢迎评论区交流指正。

  • 5
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果您是试验人员,您是否正为买了硬件设备却没有好的配套软件进行数据采集而痛骂? 如果您是硬件厂商、销售人员,您是否正为没有配套软件而影响硬件产品销售而焦急? 如果您是科研人员,您是否正为如何将采集频率不同的多套采集数据统一到同一时间序列而烦恼? 如果您是研究生,您是否正为老板交代的试验数据采集分析任务而抓狂? 通用型多串口数据采集分析系统主要用于串口数据采集和分析,操作简单,通用性强,支持多个串口同时采集。 主要功能 1、读取串口数据,并在软件界面上以记录和解析两种模式进行显示。 2、保存数据到磁盘文件。 3、根据实际需要,对采集到的数据进行重新采样。 主要特点 1、满足基本条件的所有串口通信设备数据采集均可采用本系统完成,通用性强。 2、数据采样及文件记录采用多线程方式,保证互不冲突。 3、自动记录用户设定的选项,下次使用时直接调用,无需重复配置。 4、提供多种插值采样方式,确保重新采样数据能够较准确地反映真实情况。 5、数据采样记录精确到毫秒,确保数据具有较高精度。 6、采用时间、串口号、各类标识自动命名文件夹、数据文件,保证采样数据组织得更清晰明了。 7、支持多个串口同时采集,请将数据置于同一位置,无需打开多个程序,简单快捷。同时界面串口数可手动配置,非常灵活。 适用范围 适用于任何包含以下2条特征的任意串口通信设备数据采集,如GPS、姿态仪、全站仪、电子秤、水准仪等。 1、串口数据以回车符作为每条数据分隔。 2、串口数据采用ASCII字符编码,而非十六进制编码。 3、本软件仅适用于微软操作系统,包括Windows XP/2000/Vista/2008/Win7操作系统。
### 回答1: 这里有一个示例代码可以参考: import serial import MySQLdb # 打开串口 ser = serial.Serial("/dev/ttyUSB0", 9600) # 连接MySQL数据库 db = MySQLdb.connect("localhost", "username", "password", "database") cursor = db.cursor() while True: # 读取串口数据 data = ser.readline() # 将数据写入MySQL cursor.execute("INSERT INTO table_name (data) VALUES (%s)", (data)) # 提交数据 db.commit() ### 回答2: 要用Python代码连接Arduino UNO R3并将数据写入MySQL数据库,你需要进行以下步骤: 1. 首先,你需要确保已经连接好了Arduino UNO R3到计算机上,并且已安装好了Arduino IDE。 2. 在Arduino IDE中,编写一个简单的程序来读取传感器数据(假设我们使用的是温度传感器)。该程序将数据通过串口发送给计算机。 3. 在Python中,你需要安装pyserial库来与Arduino进行串口通信。你可以在终端中运行以下命令来安装pyserial: ```python pip install pyserial ``` 4. 在Python代码中,导入pyserial库并连接到Arduino的串口。你需要确定Arduino连接到计算机的串口号,并将其作为参数传递给Serial函数。例如,如果串口号为COM3,代码如下所示: ```python import serial arduino = serial.Serial('COM3', 9600) ``` 5. 接下来,你可以使用arduino.readline()函数来读取来自Arduino的数据,并将其存储在变量中。例如,将温度数据存储在变量temperature中: ```python temperature = arduino.readline().decode('utf-8').rstrip() ``` 6. 确保你已经安装了MySQL Connector库,你可以在终端中运行以下命令来安装MySQL Connector: ```python pip install mysql-connector-python ``` 7. 在Python代码中,导入MySQL Connector库并连接到你的MySQL数据库。你需要提供数据库的主机地址、用户名、密码和数据库名称。例如: ```python import mysql.connector mydb = mysql.connector.connect( host="localhost", user="yourusername", password="yourpassword", database="yourdatabase" ) ``` 8. 创建一个游标对象,并使用execute()方法执行插入语句,将读取到的温度数据写入数据库中。例如: ```python mycursor = mydb.cursor() sql = "INSERT INTO temperature (value) VALUES (%s)" val = (temperature,) mycursor.execute(sql, val) mydb.commit() ``` 9. 最后,关闭数据库连接和串口连接。代码如下所示: ```python mycursor.close() mydb.close() arduino.close() ``` 以上是一个简单的Python代码示例,连接到Arduino UNO R3并将数据写入MySQL数据库。当你运行该代码时,你将能够读取到Arduino传感器数据并将其存储在数据库中。请确保在代码中使用正确的串口号、主机地址、用户名、密码和数据库名称。 ### 回答3: 要使用Python代码连接Arduino UNO R3读取数据并将其写入MySQL数据库,您可以遵循以下步骤: 1. 确保您的Arduino UNO R3正确连接到计算机上,并且您已经安装了Arduino IDE来编程控制它。 2. 在Arduino IDE中,编写一个简单的程序来读取传感器数据并将其发送给计算机。例如,您可以使用Serial.println()函数将数据发送到串行端口。确保程序正常运行,并记下Arduino连接的串行端口号。 3. 在计算机上,确保您已经安装了Python和适当的MySQL连接库,比如mysql-connector-python(使用pip install mysql-connector-python命令安装)。 4. 在Python代码中,导入所需的库和模块。例如:import serial(用于与Arduino通信)和import mysql.connector(用于与MySQL数据库通信)。 5. 建立与数据库的连接。使用mysql.connector.connect()函数,并提供数据库的用户名、密码、主机和数据库名称等详细信息。 6. 使用serial.Serial()函数在Python中创建一个串行对象,并传入串行端口号、波特率等参数来与Arduino通信。 7. 在一个无限循环中,使用serial.readline()函数从串行端口读取Arduino发送的数据。将数据转换为适当的格式(例如字符串或数字)。 8. 将读取数据插入到MySQL数据库中。使用mysql.connector的insert语句,将数据插入到数据库中的适当表中。 9. 如果需要,确保及时地提交数据库更改。使用connection.commit()函数提交更改。 10. 关闭与串行端口和数据库的连接。使用serial.close()函数关闭与Arduino的连接,并使用connection.close()函数关闭与MySQL数据库的连接。 这些步骤是一个基本的指导,您可以根据您的需求进一步自定义和优化代码。也可以使用其他Python库和模块来实现此功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值