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()


版权声明:本文为NBshoolang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。