2016-04-26 18 views
0

Also verwende ich Pygame, um eine Anzeige für einen Quadratur-Encoder-Zähler zu erstellen. Ich verwende EZText, um eine Benutzereingabe auf dem Display zu veranlassen, wo ich die maximale Anzahl ändern und den aktualisierten Wert über UART an den Mikrocontroller senden kann, der für das tatsächliche Zählen verantwortlich ist. Hier ist mein Code (sorry für die Länge, markierte ich den Teil, der mit der Benutzereingabe zum Boden hat):Raspberry Pi sendet dieselben Daten?

import sys, serial, string, pygame, eztext 
import pygame.locals as GAME_GLOBALS 
import pygame.event as GAME_EVENTS 

windowWidth = 1680 
windowHeight = 1050 
maxCount New = 32767 
posDataStr = " " 
rect1 = (1000,350,290,75) 
rect2 = (1000,555,290,75) 

black = (0,0,0) 
white = (248,248,255_ 

pygame.init() 
infoObject = pygame.display.Info() 
surface = pygame.display.set_mode((windowWidth,windowHeight), pygame.FULLSCREEN) 
background = pygame.image.load("/home/pi/MyProjects/background.png") 
myFont = pygame.font.SysFont("monospace",96,1) 
surface.blit(background, (0,0)) 
pygame.mouse.set_visible(0) #hide mouse pointer 

def quitGame(): 
    pygame.quit() 
    sys.exit() 

DEVICE = "/dev/ttyAMA0" 
ser = serial.Serial(DEVICE, 19200) 

#draw Max Count rectangles 
pygame.draw.rect(surface, (black), (995,550,300,85)) 
pygame.draw.rect(surface, (white), (1000,555,290,75)) 

# draw current count background (black) rectangle (since it doesn't need to update) 
pygame.draw.rect(surface, (black), (995,345,300,85)) 

#draw maxCountNew as text 
maxCountText = myFont.render(str(maxCountNew), 1, (black)) 
surface.blit(maxCountText, (1000,545)) 

pygame.display.update() 

while True: 

    posData = [0,0,0,0,0,0,0] 

    i = ser.read() 
    if i == '*': 
     for x in range (0,6): 
      posData[x] = ser.read() 
      if posData[x] == ',' or posData[x] == '\00' 
       del posData[x:] 
       posDataStr = ''.join(posData) 
       break 

    #draw posDataStr rectangles 
    pygame.draw.rect(surface, (white), (1000,350,290,75)) 

    #draw currentCountStr as text 
    currentCountText = myFont.render(posDataStr,1,(black)) 
    surface.blit(currentCountText, (1000,340)) 

    for event in GAME_EVENTS.get(): 

     if event.type == pygame.KEYDOWN: 

      if event.key == pygame.K_ESCAPE: 
       quitGame() 

################################################################################################### 
#THIS IS THE PROBLEMATIC SECTION (I think) 


      if event.key == pygame.K_r: 
       txtbx = eztext.Input(maxlength=5,color=black,prompt='Enter New Resolution: ') 

       while True: 

        events = pygame.event.get() 

        #blit txtbx on the screen 
        txtbx.draw(surface) 

        #update txtbx 
        txtbx.update(events) 

        #refresh the display 
        pygame.display.flip() 

        if event.key == pygame.K_SPACE: 
         break 
        if len(txtbx.value) > 4: #once 5 digits are entered 
         break 

       newMax = txtbx.value 

       #write new position to MCU 
       ser.write(newMax.encode()) 
       print newMax.encode()  //for diagnostic purposes 

       #max count is resolution - 1 
       maxCountNewInt = int(newMax) - 1 

       #convert back to a string 
       maxCountNew = str(maxCountNewInt) 

       #refresh the display 
       surface.blit(background, (0,0)) 
       pygame.draw.rect(surface,(white),(1000,555,290,75)) 
       maxCountText = myFont.render(maxCountNew, 1, (black)) #display new max count txt 
       surface.blit(maxCountText, (1000,545)) 
       pygame.display.update() 

    pygame.display.update(rect1) 
    pygame.display.update(rect2) 

Wenn ich einen Wert mit dem EZText Aufforderung eingeben, wurden die eingegebenen Werte korrekt in die gespeichert werden newMax Variable. Das erste Mal, wenn ich die Daten an meinen Mikrocontroller sende, bekomme ich den richtigen Wert. Bei nachfolgenden Eingaben am RasPi wird die Variable newMax korrekt angepasst, aber der gleiche Wert wie beim ersten Mal wird an den Mikrocontroller gesendet. Verwende ich ser.write() falsch?

Antwort

0

Können Sie nicht einfach txtbx.value = ""?

+0

Entschuldigung, ich habe gerade meinen Post bearbeitet. Ich habe ein wenig mehr diagnostiziert (einschließlich Ihrer Empfehlung) und es sieht so aus, als ob der txtbx.value korrekt aktualisiert wird, aber die seriellen Daten, die gesendet werden, falsch sind. – cjswish