python下使用串口进行16进制命令和数据发送

日期:2021年9月17日,本座天龄:13397天

1. 下位机只能接受16进制固定格式数据

2. 采用串口TTL 自定义16进制格式指令

3. 程序中使用数组完成设定整数值的替换

感谢程序中借鉴的前人的代码,希望对其他人也有帮助。

直接上代码:

#Python 3.8.5 下完成测试
 
import serial
import time
 

#自定义函数——功率设定
def mw_p_set(mw_value):
    mw_set=[0xA5,0x5A,0x01,0x01,0x00,0x00,0x55,0xAA] #初始设置值为0W
    #数据结构:头1 头2  地址 命令1  数高  数低  尾1  尾2
    if((mw_value>=0)and(mw_value<=1000)):
        y_h=mw_value>>8#输入功率整数值转换为16进制,整形数>>8将得到高位十六进制数字节(16进制数<<8将得到高位整形数字节) 
        y_l=mw_value&0xff#十六进制低位字节
        mw_set[4]=y_h#功率值高字节替换
        mw_set[5]=y_l#功率值低字节替换
        ser.write(mw_set)#输出功率设定值
        time.sleep(0.1)
        #a=[0x01,0xe0]#高低字节16进制转换成整数示例如下:
        #x_h=a[0]
        #x_l=a[1]
        #x=x_h<<8|x_l
        #print(x)#示例结束
        print('功率设定值为(Watt):',mw_value)
        return 1
    else:
        print('输入值需要为0~1000范围整数')
        return 0
 
 
 
ser = serial.Serial("com11", 115200)   # 选择串口,并设置波特率
if ser.is_open:
    print("port open success")
else:
    print("port open failed")
    
def main():
 
 while True:  
    # hex(16进制)转换为bytes(2进制),应注意Python3.7与Python2.7此处转换的不同
    #send_data = bytes.fromhex('ff 01 00 55 00 00 56')    # 发送数据转换为b'\xff\x01\x00U\x00\x00V'
    #ser.write(send_data)   # 发送命令
    #time.sleep(0.1)        # 延时,否则len_return_data将返回0,此处易忽视!!!
 
    len_return_data = ser.inWaiting()  # 获取缓冲数据(接收数据)长度
    if len_return_data !=0:
        return_data = ser.read(len_return_data)  # 读取缓冲数据
        # bytes(2进制)转换为hex(16进制),应注意Python3.7与Python2.7此处转换的不同,并转为字符串后截取所需数据字段,再转为10进制             
        mw_p_set(600) #测试自定义函数
    # 清空接收缓冲区
    ser.flushInput()
    # 必要的软件延时
    time.sleep(0.1)
 
 
 
if __name__=='__main__':
    try:
        main()
    except KeyboardInterrupt:
        if ser != None:
            ser.close()

### 回答1: 要通过Python编程实现串口发送16进制数据,需要使用PySerial模块和binascii模块。 首先,需要安装PySerial模块,可以在终端中使用pip install pyserial命令进行安装。 接着,在Python程序中,可以使用Serial模块中的serial.Serial()函数初始化串口连接。例如: ``` import serial ser = serial.Serial('/dev/ttyUSB0', 9600) # 这里的参数根据实际情况进行修改 ``` 其中,第一个参数是串口的地址,第二个参数是波特率。 接下来,就可以使用binascii模块中的unhexlify()函数将16进制字符串转换为字节数组,并将该字节数组发送串口中。例如: ``` import binascii data = b'\x00\x01\x02\x03' # 要发送16进制数据,这里使用字节数组表示 ser.write(data) # 发送数据串口 ``` 其中,b'\x00\x01\x02\x03'表示一个包含4个字节的字节数组,分别是0x00、0x01、0x02和0x03。 最后,记得在使用串口后,要使用Serial模块中的ser.close()函数关闭串口连接。完整的代码如下: ``` import serial import binascii ser = serial.Serial('/dev/ttyUSB0', 9600) # 初始化串口连接,这里的参数根据实际情况进行修改 data = b'\x00\x01\x02\x03' # 要发送16进制数据,这里使用字节数组表示 ser.write(data) # 发送数据串口 ser.close() # 关闭串口连接 ``` 这样就可以通过Python程序实现串口发送16进制数据了。 ### 回答2: Python 是一种通用的编程语言,它支持串口通信、网络编程等。作为一种高级编程语言,Python 非常适合用于数据处理、科学计算、机器学习等领域。在 Python串口通信是很常见的,有时候我们需要向串口发送 16 进制数据Python使用 pyserial 库来进行串口通信,这个库提供了向串口发送数据的方法,可以使用这个方法来发送十六进制数据。我们可以先将要发送数据转换为十六进制,然后再发送串口。 将数据转换为十六进制可以使用 Python 内置的 hex 函数,该函数将十进制数字转换为十六进制字符串。然后再使用字节编码函数 encode 将十六进制字符串转换为字节串,即可使用 pyserial 库发送数据。 假设我们要发送数据是 0x12, 0x34,下面的代码演示了如何将其转换为字节串并发送串口: ```python import serial # 打开串口 ser = serial.Serial('/dev/ttyS0') # 转换数据 data = [0x12, 0x34] hex_data = ''.join(format(x, '02x') for x in data) # 发送数据串口 ser.write(hex_data.encode()) # 关闭串口 ser.close() ``` 在这个例子中,我们把要发送的 16 进制数存储在列表 data 中。然后使用 join 函数将其转换为一个字符串 hex_data。最后,我们使用 encode 函数将字符串转换为一个字节串并写入串口。 总之,Python 提供了很多库来进行串口通信,包括 pyserial、serial、pylint 等。这些库提供了丰富的功能,可以轻松地与串口通信进行交互,包括获取、发送数据等。通过使用这些库,我们可以轻松地将 16 进制数据发送串口。 ### 回答3: 在Python中通过串口发送16进制数据,可借助于pyserial库中的Serial类。这里介绍一种基于该类的简单实现方法: 1. 首先,需要导入pyserial库以及定义串口通信所需的端口号、波特率等参数: ```python import serial ser = serial.Serial( port='COM3', # 串口号 baudrate=115200, # 波特率 bytesize=serial.EIGHTBITS, # 数据位数 parity=serial.PARITY_NONE, # 奇偶校验 stopbits=serial.STOPBITS_ONE, # 停止位 timeout=None ) ``` 2. 然后,可定义一些16进制数据,如'0xAA', '0x55', '0x01'等: ```python data = bytearray([0xAA, 0x55, 0x01]) # 16进制数据 ``` 3. 最后,使用串口发送函数写入数据即可: ```python ser.write(data) # 向串口发送16进制数据 ``` 完整的Python串口发送16进制数据的示例代码如下: ```python import serial ser = serial.Serial( port='COM3', # 串口号 baudrate=115200, # 波特率 bytesize=serial.EIGHTBITS, # 数据位数 parity=serial.PARITY_NONE, # 奇偶校验 stopbits=serial.STOPBITS_ONE, # 停止位 timeout=None ) data = bytearray([0xAA, 0x55, 0x01]) # 16进制数据 ser.write(data) # 向串口发送16进制数据 ser.close() # 关闭串口 ``` 以上就是Python串口发送16进制数据的简单实现方法。其中,bytearray()函数用于将输入的十六进制数据转换成字节序列,以便后续的写入操作。通过这种方法,可以轻松地在Python中实现串口数据发送,并且在实际应用中具有很高的灵活性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值