所以我正在编写一个程序来调整旋转磁场的速度。基本上,我只是试图通过串口发送一个浮点来表示用户的预期速度。但是我收到的错误并没有多大意义。我已经在一小部分代码中隔离了错误。
代码:
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()
函数肯定可以单独打印输入的数字。
答案 0 :(得分:1)
serial.Serial.write()
期望在str
对象中传递,而不是浮点值。 str
对象是可迭代的。
将字节数据写入端口。这应该是
bytes
类型(或兼容,例如bytearray
或memoryview
)。必须对Unicode字符串进行编码(例如'hello'.encode('utf-8'
)。在版本2.5中更改:在可用时接受
bytes
和bytearray
的实例(Python 2.6及更高版本),否则接受str
。
在Python 2中,bytes
是str
的别名(为了更容易编写与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期望阅读的内容。