2016-01-06 22 views
0

我试图用python控制使用RS232的投影机。此链接具有有关端口设置和预期响应的所需信息。 http://www.audiogeneral.com/Optoma/w501_rs232.pdfPython串行读取不工作

要summerise它 波特= 9600, 数据位= 8, 无奇偶校验, 1个停止位, 无流量控制。

当发送命令“〜00124 1 \ r”时,投影机应该响应okn,其中n是电源状态。

当命令“〜0000 1 \ r”被送到投影机应该

从腻子我能够发送的命令和其他命令的权力,并看到投影机做的事情应该是动力。我还可以发送读取命令,并将适当的okn响应返回给腻子。

从python中,我可以发送开机命令并查看投影机的电源。然而,当我发送电源状态命令时,我从不会看到任何字符进入读缓冲区。

这里是我写的一个测试脚本代码,试图调试这个。

import serial 
ser = serial.Serial("/dev/ttyUSB0") 

print ser.baudrate 
print ser.bytesize 
print ser.parity 
print ser.stopbits 
print ser.xonxoff 
print ser.rtscts 
print ser.dsrdtr 
print ser.name 

print "Power State" 
ser.write("~00124 1") 

while ser.inWaiting() > 0: 
    response = ser.read(3) 
    print response 


output: 
9600 
8 
N 
1 
False 
False 
False 
/dev/ttyUSB0 
True 
Power State 

我期望电源状态线后OKN,但它不显示

+0

我没有看到“Power State”后面的任何内容,这表明ser.inWaiting()的返回值<= 0,所以你应该打印它,它是type(),因为它可能是一个字符串而不是int。 –

+0

我打印它的类型是int,但它的值是0,所以循环不会运行。我试着用True:它只是挂起,直到我杀了程序。 – CrimsonKnights

回答

0

腻子仿真串行终端,比如小型机在Windows的Linux/Unix或超级终端。 尝试在字符串末尾添加\ n \ r以充当真正的串行终端。

我建议你尝试读取每个字节的数据字节而不是3个字节。如果使用readline方法更好。

+0

不要认为readine会起作用,因为我可以告诉投影机不会发送\ n来创建新行,它只会在字符后面发送\ r。我尝试了1个字节并且现在在写入语句中添加了\ n – CrimsonKnights

+0

\ r是问题的一部分,我还必须在写入和读取之间添加一个time.sleep(0.05),以便投影机有时间响应 – CrimsonKnights

+0

您可以也尝试将端口超时设置为无,这会导致所有读取调用被阻止。通过这种方式,Python脚本将等待至少n个字节的收到。尝试在串行端口上调用方法flush,以确保在调用read方法之前发送所有字节 – sardylan