pySerial 程序停止正常工作

Posted

技术标签:

【中文标题】pySerial 程序停止正常工作【英文标题】:pySerial Program Stops Working Correctly 【发布时间】:2016-01-11 01:55:19 【问题描述】:

我一直在玩弄我的 Arduino,并正在创建一个程序来在 LCD 屏幕上显示推文。不幸的是,我编写的用于检索和发送推文的 python 程序似乎在一分钟或更短的时间内停止工作。然后它会停止将任何输出打印到控制台,并且每次更新时只在 Arduino 上显示一个字符。

我假设这是与串行相关的代码的问题,因为如果我删除与 twitter 相关的所有内容,它会遇到同样的问题。如果我从 Arduino IDE 中的串行监视器发送输入,Arduino 代码可以正常工作,所以我认为我在这方面也很好。

以下是我的代码,任何帮助将不胜感激。

import serial
import tweepy
import time

ser = serial.Serial("COM3", 9600)

auth = tweepy.OAuthHandler("authstuff")
auth.set_access_token("accessstuff")

api = tweepy.API(auth)


def find_tweet():
    public_tweets = api.user_timeline("duderitsover")
    tweet = public_tweets[0].user.screen_name + ": " + public_tweets[0].text
    print tweet
    ser.write(tweet.encode('ascii'))



while True:
    print "in loop"
    find_tweet()
    time.sleep(4)

还有 Arduino 代码以防万一(这是一团糟,抱歉)

#include <LiquidCrystal.h>
#include <String.h>

LiquidCrystal lcd(2, 3, 4, 8, 9, 10, 11);
String long_string = "Long sting long string longer string long string this string is very long";
String data;
String temp_data;

String read_input;
unsigned long current_time;
unsigned long led_delay = 0;
bool has_updated = false;


int dial_position;



void setup()  
  Serial.begin(9600);
  lcd.begin(16,2);
  pinMode(5, OUTPUT);
  digitalWrite(5, HIGH);



void loop() 
  current_time = millis();

  if (led_delay < current_time) 
    digitalWrite(5, LOW);
    has_updated = false;
  

  Serial.println(analogRead(A0));
  dial_position = analogRead(A0) / 10;

  if (read_input != "" && read_input != long_string) 
    long_string = read_input;
    has_updated = true;
  

  if (dial_position < 10) 
    temp_data = long_string.substring(0, 33);
  
  else if (dial_position < 20) 
    temp_data = long_string.substring(33, 65);
  
  else if (dial_position < 30) 
    temp_data = long_string.substring(65, 97);
  
  else if (dial_position < 50) 
    temp_data = long_string.substring(65 + 32, 97 + 32);
  
  else if (dial_position < 60) 
    temp_data = long_string.substring(65 + 64 + 32, 97 + 64 + 32);
  
  else if (dial_position < 70) 
    temp_data = long_string.substring(65 + 64 + 64, 97 + 64 + 64);
  
  else if (dial_position < 80) 
    temp_data = long_string.substring(65 + 128 + 32, 97 + 128 + 32);
  
  else if (dial_position < 90) 
    temp_data = long_string.substring(65 + 128 + 64, 97 + 128 + 64);
  
  else if (dial_position < 100) 
    temp_data = long_string.substring(65 + 128 + 96, 97 + 128 + 96);
  

  if (temp_data != data && temp_data != "") 
    data = temp_data;

    if (temp_data.length() > 16) 
      lcd.clear();
      lcd.print(data.substring(0, 16));
      lcd.setCursor(0, 1);
      lcd.print(data.substring(16, 33));
    
    else 
      lcd.clear();
      lcd.print(data);
    

  


void serialEvent()
  read_input = Serial.readString();
  Serial.println("UPDATING");
  digitalWrite(5, HIGH);
  led_delay = current_time + 2000;

【问题讨论】:

【参考方案1】:

通过每隔几次我的循环运行使用 Serial.reset_input_buffer() 命令解决了这个问题,但不确定它是否是正确的方法,因为它的功能。

【讨论】:

以上是关于pySerial 程序停止正常工作的主要内容,如果未能解决你的问题,请参考以下文章

为啥pyserial填充USB数据包?

重启后Pyserial的串行连接问题

pyserial:没有名为工具的模块

带有 pyserial RS232 的微型开关在 tkinter 线程中启动/停止计时器,但即使停止也继续运行

pyserial 2.7,python 3.3,发送回车

如何使用 pySerial 从 serialException 中恢复