用Python从RS232读取数据

2024-10-01 05:07:22 发布

您现在位置:Python中文网/ 问答频道 /正文

这是到目前为止我的代码。它用于读取投影仪电源状态的输出

我的问题是,除了“>;”,它没有输出

已尝试使用以下内容修改响应变量:

  1. response=ser.readline()
  2. response=ser.read()
  3. response=ser.inWaiting()

有趣的是,当我在完成Python脚本之后运行cat /dev/ttyS5时。它给我输出和退出。通常,当我使用cat /dev/ttyS5时,它会一直运行,需要终止

#!/usr/bin/python
import serial
import sys
import os
import time

pin_export = 'echo 2 > /sys/class/gpio/export'
pin_out = 'sleep 0.1 && echo out > /sys/class/gpio/gpio2/direction'
pin_high = 'sleep 0.1 && echo 1 > /sys/class/gpio/gpio2/value'
pin_low = 'sleep 0.1 && echo 0 > /sys/class/gpio/gpio2/value'
pin_unexport = 'echo 2 > /sys/class/gpio/unexport'
response = ''

os.system(pin_export)
os.system(pin_out)
os.system(pin_high)

ser = serial.Serial()
ser.port = '/dev/ttyS5'
ser.baudrate = 9600
ser.bytesize = serial.EIGHTBITS
ser.parity = serial.PARITY_NONE
ser.stopbits = serial.STOPBITS_ONE
ser.xonxoff = False

ser.open()
ser.write(b'\r*pow=?#\r')
y = "1"
ser.timeout=0.5

while ser.inWaiting() > 0:
    response = ser.readline()

print(">>" + response)

time.sleep(1)
os.system(pin_low)
os.system(pin_unexport)

另一方面,如果你们中的任何人对如何从/dev/ttyS5中读取输入有更好的想法,我以后可以将其保存到文本文件中,我愿意听取建议


Tags: devimportechogpioosresponsesyspin
1条回答
网友
1楼 · 发布于 2024-10-01 05:07:22

好的,所以我自己通过测试找到了答案。如果有人带着同样的问题或相关的问题来到这里,我的答案如下

问题是rs响应的第一行包含一些非索引的值,它阻止了端口获得其他答案

#!/usr/bin/python

import serial
import sys
import os
import time

# bash commands for gpio
pin_export = 'sleep 0.05 && echo 2 > /sys/class/gpio/export'
pin_out = 'sleep 0.06 && echo out > /sys/class/gpio/gpio2/direction'
pin_high = 'sleep 0.05 && echo 1 > /sys/class/gpio/gpio2/value'
pin_low = 'sleep 0.05 && echo 0 > /sys/class/gpio/gpio2/value'
pin_unexport = 'sleep 0.05 && echo 2 > /sys/class/gpio/unexport'

# turning on pin 2
os.system(pin_export)
os.system(pin_out)
os.system(pin_high)

# serial settings
ser = serial.Serial()
ser.port = '/dev/ttyS5'
ser.baudrate = 9600
ser.bytesize = serial.EIGHTBITS
ser.parity = serial.PARITY_NONE
ser.stopbits = serial.STOPBITS_ONE
ser.xonxoff = False

# port open
ser.open()

while True:
    # buffor reset
    ser.reset_input_buffer()
    ser.reset_output_buffer()
    # sending question for projector
    ser.write('\r*pow=?#\r')
    time.sleep(0.6)

    # trashing first line
    trash = ser.readline(30)
    # the needed answer from rs
    pwrinfo = ser.readline(9)

    if pwrinfo == "*POW=OFF#":
        print "Projector OFF"
    elif pwrinfo == "*POW=ON#\r":
        print "Projector ON"
        break
    else:
        print "Heating or Cooling..."
                
    # buffor clear
    ser.flush()

# port close
ser.close()

# turning off pin 2
os.system(pin_low)
os.system(pin_unexport)

相关问题 更多 >