2014-03-30 46 views
2

我试图读取串口连接线,并将其转换为int:将字符串转换到串行连接诠释

print arduino.readline() 
length = int(arduino.readline()) 

,但得到这个错误:

ValueError: invalid literal for int() with base 10: ''

我抬头一看这个错误并且意味着它不可能将空字符串转换为int,但事实是,我的readline不是空的,因为它将它打印出来。

+0

'print arduino.readline()'的输出是什么? – skamsie

+0

问题是当你在'print'中调用'readline()'时,它会消耗内容,因此连续调用将是空的。 – alvits

回答

3

print语句将其打印出来,下一个调用读取下一行。你应该可以这样做。

num = arduino.readline() 
length = int(num) 

既然你提到Arduino正在返回C风格的字符串,你应该去掉NULL字符。

num = arduino.readline() 
length = int(num.strip('\0'))  
1

当你说

print arduino.readline() 

您已经阅读当前可用的线路。所以,下一个readline可能没有获取任何数据。你可能想在一个变量存储这个像这样

data = arduino.readline() 
print data 
length = int(data) 

由于数据似乎也有空字符(\0),你可能想要去除,像这样

data = arduino.readline().rstrip('\0') 
+0

我现在得到这个错误='ValueError:int()'的参数中的空字节。我是否需要在末尾添加空字节字符? – pattex007

+0

@ pattex007打印'print'语句是什么? – thefourtheye

+1

@ pattex007:去掉空字符。 'data.strip( '\ 0')'。我想,Arduino会返回C风格的字符串。 –

1

每次调用readline()读取一个新行,所以您的第一条语句已经读过一行,下一次您调用readline()数据不再可用。

尝试这种情况:

s = arduino.readline() 
if len(s) != 0: 
    print s 
    length = int(s) 
0

问题是,当Arduino的开始发送它开始通过最初发送空字符串的串行数据,所以pyserial拾取一个空字符串''不能转换为整数。你可以在serial.readline()之上添加一个延迟,如下所示:

while True: 
    time.sleep(1.5) 
    pos = arduino.readline().rstrip().decode() 
    print(pos)