Python如何将struct.pack值添加到将通过串行端口发送的整数中



我是python的新手,最近我提出了一个类似的问题,关于如何将十进制值转换为先低后高的整数,这个问题已经解决了,但现在我遇到了一个问题,因为我想让python从raw_input中取一个十进制值,先将其转换为先高后低的整数,然后插入一个16位整数,将其发送到串行端口到伺服控制器(devantech sd84)。我将raw_input包含在一个值中,然后将struc.pack包含在其他值中,再将第二个值放入16位整数中,但在此之前,python返回以下错误:

    Traceback (most recent call last):
    File "C:/Users/Pablo/Desktop/kdfkldkfgv", line 28, in <module>
    POS_SERVO = struct.pack('<h', 'posicion')
    error: cannot convert argument to integer

这是完整的代码:

    # -*- coding: utf-8 -*-
  import serial
  import time
  import struct
  # Para cambiar de Sistema Operativo cambiar puerto 
  #en la siguiente línea: Win COM# linux /dev/ttyS# /dev/ttyUSB#
  # #=un número asignado por tu sistema.
  port='COM3'
  sync='xAAxA0x55'
  SET_SERVO='x01'
  GET_SERVO='x02'
  SET_SPEED='x03'
  SET_MODE='x04'
  GET_MODE='x05'
  SET_AD_CNT='x06' #Controla el número de canales analógicos.
  GET_AD_CNT='x07' #Devuelve el número de canales analógicos actuales.
  GET_INPUT='X08' # Devuelve el estado de una entrada.
  GET_ADC='X09' #Devuelve el valor de un canal analógico.
  GET_VERSION='x0A' #Devuelve la versión del procesador seleccionado.
  GET_BULK='x15' #Usado para test en fábriica.
  TEST='X16' #Usado para test en fábrica.
  ser = serial.Serial(port, baudrate=115200, bytesize=8, parity='N', stopbits=2,timeout=1)
  if ser.isOpen():
print "Estado del puerto: Correcto."
print "Procedo a enviar modo del canal 1 y posiciones del mismo."
posicion = raw_input('Inserta un numero entre 400 y 2200:')
POS_SERVO = struct.pack('<h', 'posicion')
ser.write(sync+SET_MODE+'x01x01x19')
ser.write(sync+SET_SERVO+'x01x02'+POS_SERVO)
time.sleep(1.6) 
ser.close
print "Todo el proceso completado correctamente."
   else:
print "El puertito está cerrado"
   print "Hasta Luego :D"

为了有相同控制器的人的兴趣,我将解释16位整数的前三个字节是同步的(\xAA\xA0\x55),然后是命令类型SET_SERVO(位置)(\x01),然后1的通道1-84是(#x01),在这种情况下是字节计数2(\x02),伺服位置低字节,然后是高字节(POS_SERVO)(例如1500\xDC\x05)

我不知道如何解决它,因为它不是一个论点——事实上它是一个值,我不知道该如何告诉python。

您正在传递一个字符串文字;您应该传递一个值,用裸名称表示。但在处理它之前,您需要将其转换为整数。

POS_SERVO = struct.pack('<h', int(posicion))

不过,您应该考虑验证输入,以确保它是corect类型并且在所需范围内。

在我的案例中,我四处搜索以找到问题。将ints参数传递给struct.pack,而不是字符串!

最新更新