PySerial:TypeError:'float'对象不可迭代

时间:2016-08-03 17:52:25

标签: python arduino iteration typeerror pyserial

所以我正在编写一个程序来调整旋转磁场的速度。基本上,我只是试图通过串口发送一个浮点来表示用户的预期速度。但是我收到的错误并没有多大意义。我已经在一小部分代码中隔离了错误。

代码:

import serial #imports PySerial Library

#Function allows for user input and conversion to float.
#If not float, "Invalid" is printed to the console, and input is requested again
def get_float(prompt):
        while True: #Main Loop
                try:
                        response = raw_input(prompt) #User inputs
                        return float(response) #Conversion is attempted
                except:
                        print("Invalid") #If conversion fails

def magnet_speed():
        input = get_float('Enter a speed in rpm to immediately change rotation speed\n>> ')
        print input
        arduino.write(input) #send to arduino



arduino = serial.Serial('/dev/ttyACM0', 9600) #declares which serial port the arduino is con$

magnet_speed()
exit()

如果我运行脚本,这是错误:

Enter a speed in rpm to immediately change rotation speed
>> a
Invalid
Enter a speed in rpm to immediately change rotation speed
>> 4
4.0
Traceback (most recent call last):
  File "magnet_speed.py", line 22, in <module>
    magnet_speed()
  File "magnet_speed.py", line 16, in magnet_speed
    arduino.write(input) #send to arduino
  File "/usr/local/lib/python2.7/dist-packages/serial/serialposix.py", line 498, in write
    d = to_bytes(data)
  File "/usr/local/lib/python2.7/dist-packages/serial/serialutil.py", line 66, in to_bytes
    for item in seq:
TypeError: 'float' object is not iterable

我唯一的想法是我没有从get_float()右边返回浮动,或者我没有正确定义变量input。如果我在python shell中运行它,get_float()函数肯定可以单独打印输入的数字。

1 个答案:

答案 0 :(得分:1)

serial.Serial.write()期望在str对象中传递,而不是浮点值。 str对象是可迭代的。

来自pyserial documenation

  

将字节数据写入端口。这应该是bytes类型(或兼容,例如bytearraymemoryview)。必须对Unicode字符串进行编码(例如'hello'.encode('utf-8')。

     

在版本2.5中更改:在可用时接受bytesbytearray的实例(Python 2.6及更高版本),否则接受str

在Python 2中,bytesstr的别名(为了更容易编写与Python 3向前兼容的代码)。

将您的浮动转换为字符串首先

arduino.write(str(output))

或使用不同的方法更精确地控制浮点数如何转换为字节。您可以使用format() function来控制小数点后放置的位数和/或是否使用科学记数法,或者您可以使用struct.pack() function生成C兼容的二进制表示对于价值:

arduino.write(format(output, '.4f'))  # fixed point with 4 decimals
arduino.write(pack('>d', output))     # big-endian C double

你选择的内容取决于Arduino期望阅读的内容。