(可以运行)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)

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

### 回答1: 可以参考以下代码: import serial ser = serial.Serial('COM1', 9600, timeout=1) while True: data = ser.readline().decode('utf-8').strip() if data: print(data) ser.close() 这是一个简单的串口通信实例,使用 pyserial 库实现。首先需要创建一个 Serial 对象,指定串口号和波特率。然后通过 readline() 方法读取串口数据,使用 decode() 方法将字节流转换为字符串,再使用 strip() 方法去除空格和换行符。最后关闭串口连接。 ### 回答2: pyserial是一个Python串口通信库,可以用于和串口设备进行数据的收发。下面是一个简单的pyserial串口通信实例: ```python import serial # 打开串口 ser = serial.Serial('/dev/ttyUSB0', 9600) # 发送数据 ser.write(b'Hello World!') # 接收数据 data = ser.readline() print(data) # 关闭串口 ser.close() ``` 上面的示例代码首先通过`serial.Serial`函数打开了一个串口对象,其中`/dev/ttyUSB0`是串口设备的路径,`9600`是波特率。然后使用`ser.write()`方法将字符串数据发送到串口。接着使用`ser.readline()`方法读取串口返回的数据,并将其打印出来。最后使用`ser.close()`方法关闭串口。 在使用pyserial进行串口通信时,还可以使用其他方法来实现不同的功能,比如`ser.read()`方法读取指定长度的数据、`ser.write()`方法发送字节数据、`ser.flush()`方法清空输入输出缓冲区等。 需要注意的是,在使用pyserial时,需要根据具体的串口设备和通信协议来设置串口的相关参数,包括波特率、数据位、校验位、停止位等。 希望以上的回答对您有所帮助! ### 回答3: pyserialPython中一个常用的串口通信库,可用于与设备通过串口进行数据传输。下面给出一个pyserial串口通信实例的详细示例: 首先,我们需要安装pyserial库,在命令行输入以下命令进行安装: ``` pip install pyserial ``` 接下来,我们编写一个简单的示例代码,实现通过串口发送和接收数据的功能。假设我们使用的串口号是COM1,波特率为9600,数据位为8位,停止位为1位,无校验位。 ```python import serial # 创建串口对象 ser = serial.Serial('COM1', 9600, 8, 'N', 1) # 打开串口 ser.open() # 发送数据串口 data_to_send = 'Hello, Serial!' # 要发送的数据 ser.write(data_to_send.encode()) # 接收串口发送的数据 data_received = ser.readline() print(data_received) # 关闭串口 ser.close() ``` 解释一下代码的执行过程: 1. 首先,我们导入了serial模块,并创建了一个serial.Serial对象。在创建串口对象时,需要传入串口号(可以在设备管理器中查找到)、波特率(与目标设备设置一致)、数据位(通常为8位)、校验位(通常为N,表示无校验位)、停止位(通常为1位)。 2. 然后,我们通过ser.open()打开串口。 3. 接着,我们使用ser.write()将要发送的数据转换成字节形式,并发送到串口。 4. 在接收数据时,我们使用ser.readline()方法读取串口发送的数据,并将其打印出来。 5. 最后,我们使用ser.close()关闭串口。 这就是一个简单的pyserial串口通信实例。你可以根据自己的需求,修改串口号和设置参数,实现与目标设备的串口通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值