Python与设备的串行通信

时间:2016-08-01 10:25:46

标签: python serial-port port distance period

enter image description here

我正在从一个天才的家伙instructables.com制作串口通信设备。

它将测量仓鼠在一天或一个月内的跑步距离。

使用4针6针串口电缆,如果仓鼠运行,设备可以计算她运行的时间数。

当我像下面的Python27一样运行py文件时,会出现一些错误。 “python hamster-serial.py progress.txt”

我无法理解发生了什么。 我使用的是windows8和Python2.7版本。

你能查一下我的来源吗?

import datetime
import serial
import sys

# Check for commandline argument. The first argument is the the name of the program.
if len(sys.argv) < 2:
  print "Usage: python %s [Out File]" % sys.argv[0]
  exit()

# Open the serial port we'll use the pins on and the file we'll write to.
ser = serial.Serial("/dev/ttyS1")

# Open the file we're going to write the results to.
f = open(sys.argv[1], 'a')

# Bring DTR to 1. This will be shorted to DSR when the switch is activated as the wheel turns.
ser.setDTR(1)

# The circumferance of the wheel.
circ = 0.000396 # miles
# Total distance traveled in this run of the program.
distance = 0.0

print "%s] Starting logging." % datetime.datetime.now()
start = datetime.datetime.now()

# This function a period of the wheel to a speed of the hamster.
def toSpeed(period):
  global circ
  seconds = period.days * 24 * 60 * 60 + period.seconds + period.microseconds / 1000000.
  return circ / (seconds / 60. / 60.)
  
# Waits for the DSR pin on the serial port to turn off. This indicates that the
# switch has turned off and the magnet is no longer over the switch.
def waitForPinOff():
  while ser.getDSR() == 1:
    1 # Don't do anything while we wait.

# Waits for the DSR pin on the serial port to turn on. This indicates that the
# switch has turned on and the magnet is current over the switch.
def waitForPinOn():
  while ser.getDSR() == 0:
    1 # Don't do anything while we wait.

# The main loop of the program.
while 1:
  waitForPinOn()
  
  # Calculate the speed.
  end = datetime.datetime.now()
  period = end - start
  start = end
  speed = toSpeed(period)
  # Increment the distance.
  distance = distance + circ
  
  waitForPinOff()
  
  # We'll calculate the time the switch was held on too so but this isn't too useful.
  hold = datetime.datetime.now() - start
 
  # If the switch bounces or the hamster doesn't make a full revolution then
  # it might seem like the hamster is running really fast. If the speed is
  # more than 4 mph then ignore it, because the hamster can't run that fast.
  if speed < 4.0:
    # Print out our speed and distance for this session.
    print "%s] Distance: %.4f miles Speed: %.2f mph" % (datetime.datetime.now(), distance, speed)
      
    # Log it to and flush the file so it actually gets written.
    f.write("%s\t%.2f\n" % (datetime.datetime.now().strftime("%D %T"), speed))
    f.flush()
    

1 个答案:

答案 0 :(得分:0)

嗯,ser = serial.Serial("/dev/ttyS1")适用于Linux机器,在Windows上你需要ser = serial.Serial("COM1")之类的东西(你可以在设备管理器中检查你需要什么COM)。

作为旁注,

def waitForPinOff():
   while ser.getDSR() == 1:
      1 # Don't do anything while we wait.

会吃掉你的CPU。你更善于:

def waitForPinOff():
   while ser.getDSR() == 1:
      time.sleep(1) # Don't do anything while we wait.