本文介绍了Python - 从小数到整数低字节,然后是高字节的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好,我是一个Python新手,但我对它感兴趣了2年。我想制作机器人,我正在尝试在混合器上使用Python与 pyserial 。但是我发现了一个问题,在谷歌和这个网站上寻找答案2小时后,我发现我可能因为解决不了问题而被推迟。我认为它还没有被问到。



我使用一个devantech sd84伺服控制器,并通过一个USB端口控制串行设备,因此我使用 pyserial 。问题是我希望Python在 400 - 2200 之间输入用户输入的十进制值,我知道如何要做到这一点,但我需要Python将其显示为两个字节,然后先发送低字节然后发送高字节。例如(伪代码,因为我不知道如何编程它)

  #ask (范围并不重要)
x = raw_input('\t插入400-2200之间的数字:')#在400-2200之间插入一个数字:1500
#显示它为十六进制
十六进制(x)#5dc
#输入两个字节,在这种情况下添加一个零(?)我不知道该怎么做。
0xDC 0x05
#将它添加到一个16位整数,通过虚拟串口(?)发送给伺服控制器,我也不知道该怎么做。
ser.write('\xAA\xA0\x55\x01\x01\x02\xDC\x05')

为了让那些拥有相同控制器的人感兴趣,我将解释16位整数前三个字节是同步(\xAA\xA0\\ \\ x55)那么命令SET_SERVO(position)(\x01)的类型,那么1的通道1-84是(\ 0x01),那么在这种情况下是2的字节计数(\ x02 )和伺服位置低字节,然后是高字节(\xDC\x05),现在我用我的iPod在应用程序中计算出来然后我手动插入哈哈哈我想停止那个愚蠢的东西,让他的计算器做它为我。

现在我将发布我为测试目的制作的代码,它在通道1中制作了一个伺服器,它可以在各种速度下完成各种速度并打印出有趣的东西西班牙语,而伺服跳舞我手动计算位置,并插入他们哈哈哈听起来像我的历史。

 # -  *  - 编码:utf-8  -  *  -  
#Pablo P. 2012bailecillo
#mueve un servo en el canal 1 atravésde todo su recorido e imprime frases mientras dicho servobaila
import serial
import time
#Para cambiar de Sistema Operativo cambiar puerto
la siguientelínea:Win COM#linux / dev / ttyS#/ dev / ttyUSB#
##= unnúmeroasignado 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 elnúmerode canalesanalógicos。
GET_AD_CNT ='\x07'#Devuelve elnúmerode canalesanalógicosactuales。
GET_INPUT ='\X08'#Devuelve el estado de una entrada。
GET_ADC ='\X09'#Devuelve el valor de un canalanalógico。
GET_VERSION ='\x0A'#Devuelve laversióndel procesador seleccionado。
GET_BULK ='\x15'#Usado para test enfábriica。
TEST ='\X16'#Usado para test enfábrica。
ser = serial.Serial(port,baudrate = 115200,bytesize = 8,parity ='N',stopbits = 2,timeout = 1)

printHola!me alegro de verte 。
time.sleep(2)

如果ser.isOpen():
printEstado del puerto:Correcto。
time.sleep(1)
print程序模拟运河1是posismion del mismo。
time.sleep(3)
printComprobando sistemas de baile ...
ser.write(sync + SET_MODE +'\x01\x01\x19')
ser.write(sync + SET_SERVO +'\x01\x02\x98\x08')#izda
time.sleep(3)
ser.write(sync + SET_SERVO +'\x01 \x02\x90\x01')#derecha
time.sleep(1)
ser.write(sync + SET_SPEED +'\x01\x01\x10')
ser.write(sync + SET_SERVO +'\x01\x02\x78\x05')#centro
time.sleep(2)
printVamos a bailar!
time.sleep(2)
printpreparados ...
time.sleep(1)
printlistos ...
time.sleep( 1)
打印Yaaaa !!
ser.write(sync + SET_SERVO +'\x01\x02\x98\x08')#izda
time.sleep(3)
ser.write(sync + SET_SERVO +') \x01\x02\x90\x01')#derecha
time.sleep(3)
ser.write(sync + SET_SERVO +'\x01\x02\x98\x08 ')#izda
time.sleep(3)
ser.write(sync + SET_SERVO +'\x01\x02\x90\x01')#derecha
time.sleep( 3)
ser.write(sync + SET_SERVO +'\x01\x02\x98\x08')#izda
time.sleep(3)
ser.write(sync + SET_SERVO +'\x01\x02\x90\x01')#derecha
time.sleep(3)
ser.write(sync + SET_SERVO +'\x01\x02\x78\\ \\ x05')#centro
time.sleep(3)
ser.write(sync + SET_SPEED +'\x01\x01\x00')
ser.close()
time.sleep(1)
printTodo el proceso completado correctamente。

其他:
printEl puertitoestácerrado

printHasta Luego:D
 >>> struct.pack('< h',1500)
'\xdc\x05'


Hello I'm a newbie with Python but I've been interested on it for 2 years. I want to make robots and I'm trying to use Python with pyserial on blender. But I found a problem and after 2 hours of looking for the answer in Google and in this site I found that maybe I'm retarded because I can't solve it. I think it isn't asked yet.

I'm using a devantech sd84 servo controller and controling it via a USB port a serial device so I use pyserial. The problem is that I want Python to take a decimal value fom a user input between 400-2200 and I know how to do it but I need Python to show it as two bytes and send the low byte first and then the high byte. for example (pseudo code as I don't how to program it yet):

    #ask for a decimal number between a range (the range does not really matters)
    x = raw_input('\tInsert a number between 400-2200:') #Insert a number between 400-2200: 1500
    #show it as hex
    hex(x) #5dc
    #put it in two bytes and in this case add a zero(?) I don't know how to do that.
    0xDC 0x05
    #add it to a 16-bit integer to send it to the servo controller via the virtual serial port(?) i also don't know how to do that.
   ser.write('\xAA\xA0\x55\x01\x01\x02\xDC\x05')

For the interest of people who have the same controler I'll explane that 16bit integer first three bytes are sync (\xAA\xA0\x55) then the type of command SET_SERVO (position) (\x01) then the channel 1-84 for 1 is (\x01) then a byte count in this case 2 (\x02) and the servo position low byte and then the high byte (\xDC\x05) which nowadays I calculate with in my iPod with an app and then I insert manually hahaha I want to stop whith that stupid thing and let he compuer do it for me.

Now I will post a code I made for testing purposes it mades a servo in channel 1 go troug it's full range ata different speeds and print funny things in spanish while the servo "dances" I manually calculated the positons and inserted them hahaha sounds like history for me.

    # -*- coding: utf-8 -*-
    #Pablo P. 2012 "bailecillo"
    #mueve un servo en el canal 1 a través de todo su recorido e imprime frases mientras dicho servo "baila"
    import serial
    import time
    # 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)

   print "Hola! me alegro de verte."
   time.sleep(2)

   if ser.isOpen():
print "Estado del puerto: Correcto."
time.sleep(1)
print "Procedo a enviar modo del canal 1 y posicion(es) del mismo."
time.sleep(3)
print "Comprobando sistemas de baile..."
ser.write(sync+SET_MODE+'\x01\x01\x19')
ser.write(sync+SET_SERVO+'\x01\x02\x98\x08') #izda
time.sleep(3)
ser.write(sync+SET_SERVO+'\x01\x02\x90\x01') #derecha
time.sleep(1)
ser.write(sync+SET_SPEED+'\x01\x01\x10')
ser.write(sync+SET_SERVO+'\x01\x02\x78\x05') #centro
time.sleep(2)
print "Vamos a bailar!"
time.sleep(2)
print "preparados..."
time.sleep(1)
print "listos..."
time.sleep(1)
print "Yaaaa!!"
ser.write(sync+SET_SERVO+'\x01\x02\x98\x08') #izda
time.sleep(3)
ser.write(sync+SET_SERVO+'\x01\x02\x90\x01') #derecha
time.sleep(3)
ser.write(sync+SET_SERVO+'\x01\x02\x98\x08') #izda
time.sleep(3)
ser.write(sync+SET_SERVO+'\x01\x02\x90\x01') #derecha
time.sleep(3)
ser.write(sync+SET_SERVO+'\x01\x02\x98\x08') #izda
time.sleep(3)
ser.write(sync+SET_SERVO+'\x01\x02\x90\x01') #derecha
time.sleep(3)
ser.write(sync+SET_SERVO+'\x01\x02\x78\x05') #centro
time.sleep(3)
ser.write(sync+SET_SPEED+'\x01\x01\x00')
ser.close()
time.sleep(1)
print "Todo el proceso completado correctamente."

    else:
        print "El puertito está cerrado"

    print "Hasta Luego :D"
解决方案

This is why programmers new to Python should look over the libref.

>>> struct.pack('<h', 1500)
'\xdc\x05'

这篇关于Python - 从小数到整数低字节,然后是高字节的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-05 10:28