2017-04-07 1 views
0

J'utilise mon lecteur de code-barres via un port COM, avec le code ci-dessous, qui simule un terminal PDV et imprime le nom du produit et son prix sur l'écran tiré d'une base de données MySQL. Le problème est que pendant que le port COM est ouvert, et prêt à lire les données, le loop until inkey=chr(13) ne fonctionnera pas, quand je veux quitter le "mode de balayage", et obtenir le montant total dû, par exemple.Comment quitter la lecture de code-barres via le port COM en appuyant sur une entrée?

Ceci est écrit en FreeBasic, mais je suis plutôt intéressé par le concept général de la façon de résoudre ce problème, pas une solution spécifique à la langue.

dim buffer as string*20 'reads a 20 character long string 
do 
    if open com ("COM6:9600,N,,2" for input as #1) <> 0 then 
     print "Unable to open serial port. Press any key to quit application." 
     sleep 
     end 
    end if 

    get #1,,buffer 
    print buffer 
    close #1 
loop 
+0

La seule façon que je pouvais quitter la boucle mettait une instruction IF dans la boucle avec un code-barres spécifique, par la lecture que la boucle quitté, mais c'est la solution la plus délicate. – Gabe

Répondre

0

Je ne voudrais pas ouvrir/fermer la connexion de port dans une boucle encore et encore. Au lieu de cela, j'ouvrirais la connexion à l'appareil avant la boucle. Dans la boucle, je vérifierais les événements (touche enfoncée? Nouvelles données entrantes sur le port COM?) Et réagir d'une certaine manière. Enfin, si la boucle est terminée, je fermerais la connexion.

Code Pseudo:

Open Connection 
Do This 
    PressedKey = CheckForPressedKey() 
    If IncomingDataOnComPort? Then 
     Load Something From DB ... 
    EndIf 
Until PressedKey Was ENTER 
Close Connection 

exemple Untested FreeBASIC:

' Took the COM port parameters from your question. Don't know if correct for the device. 
Const ComPortConfig = "COM6:9600,N,,2" 

Print "Trying to open COM port using connect string "; Chr(34); ComPortConfig; Chr(34); "..." 
If (Open Com (ComPortConfig For Binary As #1) <> 0) Then 
    Print "Error: Could not open COM port! Press any key to quit." 
    GetKey 
    End 1 
End If 

Print "COM port opened! Waiting for incoming data." 
Print 
Print "Press ENTER to disconnect." 
Print 

Dim As String ComDataBuffer = "", PressedKey = "" 
Do 
    ' Key pressed? 
    PressedKey = Inkey 
    ' Incoming data on COM port ready to be read? 
    If Loc(1) > 0 Then 
     ComDataBuffer = Space(Loc(1)) 
     Get #1, , ComDataBuffer 
     Print "Received data on COM port: "; chr(34); ComDataBuffer; chr(34) 
    End If 
    ' Give back control to OS to avoid high cpu load due to permanent loop: 
    Sleep 1 
Loop Until PressedKey = Chr(13) 'ENTER 

Close #1 

Print 
Print "Disconnected. Press any key to quit." 
GetKey 
End 0