3

私はPythonの初心者で、最近、10進値を最初に下位バイトの整数に変換する方法について同様の質問をしましたが、次に上位バイトがここにあり、解決されましたが、Pythonにraw_input からの 10 進数値は、最初に下位バイト、次に上位バイトの整数に変換し、それを 16 ビット整数に挿入して、シリアル ポートからサーボ コントローラー (devantech sd84) に送信します。raw_input を値に含め、次に struc.pack を他の値に含めてから、2 番目の値を 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='\xAA\xA0\x55'
  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+'\x01\x01\x19')
ser.write(sync+SET_SERVO+'\x01\x02'+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 ビット整数の最初の 3 バイトが同期 (\xAA\xA0\x55)、次にコマンドの種類 SET_SERVO (位置) (\x01)、そしてチャネル 1- であることを説明します。 1 の 84 は (\x01)、この場合はバイト カウント 2 (\x02)、サーボ位置の下位バイト、上位バイト (POS_SERVO) (たとえば、1500 \xDC\x05 の場合)

それは引数ではなく、実際には値であり、それをpythonに伝える方法がわからないため、解決方法がわかりません。

4

2 に答える 2

4

文字列リテラルを渡しています。代わりに、そのままの名前を使用して示される値を渡す必要があります。ただし、処理する前に整数に変換する必要があります。

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

ただし、正しいタイプであり、目的の範囲内にあることを確認するために、入力の検証を検討する必要があります。

于 2012-08-19T00:58:44.893 に答える
0

私の場合、問題を見つけるために多くのことを検索しました。文字列の代わりにint引数を struct.pack に渡してください!

于 2019-05-29T12:59:29.583 に答える