Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 17.01.2015, 10:30 Titel: Etwas anders als Sleep vewenden. |
|
|
Hallo, guten Tag.
Ich frage in einer Loop ab, ob über seriell:
Code: | If Loc(dnr1) > 0 Then
Get #dnr1, , empfang_byte
Print Str(empfang_byte)
End If |
ein Byte empfangen wird mit 19200 Baud.
In der Loop habe ich ein " Sleep 1" um anderen Arbeiten Zeit zu geben.
Wiekann ich dieses Sleep ersetzen das die vollen 19200Baud empfangen werden ? Bei Sleep 1 mit 19200Baud kommen ja nur ca 1000 Byte an pro Sekunde, ohne Sleep würden es ca 1900 Byte sein.
Was kann ich da bitte reinsetzen?
danke.
Gruss
Code: |
Do
taste = InKey
IF taste = CHR(255, 107) THEN End
If MULTIKEY(FB.sc_1) Then
View PRINT 1 TO 14
Color &hff0000,RGB(240,240,240)
Cls
Locate 2,2
Print "1 = Datei laden"
Locate 4,2
Print "2 = Byte senden"
Locate 13,2
Print "Byte empfang :"
datei_laden()
Locate 8,2
Print "geladen : "+datei
View PRINT 16 TO 50
Color &h00ff00,RGB(0,0,0)
Cls
EndIf
If MULTIKEY(FB.sc_2) Then
If datei >"" Then
byte_senden()
EndIf
EndIf
If Loc(dnr1) > 0 Then
Get #dnr1, , empfang_byte
Print Str(empfang_byte)
End If
Sleep 1
Loop
|
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4700 Wohnort: ~/
|
Verfasst am: 17.01.2015, 12:47 Titel: |
|
|
Ich schätze mal, wenn du regelmäßig die Kontrolle an den Prozessor abgeben willst, wird das den eigenen Prozess nun einmal runterbremsen. Daran wird eine alternative Möglichkeit, die Kontrolle an den Prozessor abzugeben, naturgemäß nichts ändern können.
Du könntest aber einen Schleifenzähler mitführen und das SLEEP z. B. nur bei jedem 100. Durchlauf aufrufen. Das sollte den eigenen Prozess nicht so stark herunterbremsen und anderen Prozessen trotzdem noch Arbeitszeit einräumen. Muss man halt ein bisschen experimentieren, welcher Wert da geeignet ist. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 17.01.2015, 15:25 Titel: |
|
|
Jup danke.
Gruss |
|
Nach oben |
|
 |
Flo aka kleiner_hacker
Anmeldungsdatum: 23.06.2006 Beiträge: 1210
|
Verfasst am: 17.01.2015, 19:58 Titel: |
|
|
du solltest wohl versuchen, nicht Byte fuer Byte vom Seriellen Port zu lesen, sondern stattdessen lieber seltener groessere Bloecke abfragen, wenn das moeglich ist.
Ausserdem solltest du blockierende Systemaufrufe zum Einlesen verwenden anstatt zu pollen. Damit kannst du bequem so viel lesen wie du willst, und solange dein Programm auf daten vom Seriellen Port wartet, kriegt eh ein anderes Programm die Rechenzeit zugeteilt.
Wenn du allerdings dann in der Hauptschleife noch etwas anderes tun willst, z.B. auf Benutzerinteraktion warten, dann koennte man das mit mehreren Threds realisieren, das koennte aber zu weit fuehren wenn du mit dem Konzept nicht vertraut bist. _________________ MFG
Flo
Satoru Iwata: Wer Spaß am Spielen hat, fragt nicht nach Grafik.
zum korrekten Verstaendnis meiner Beitraege ist die regelmaessige Wartung des Ironiedetektors unerlaesslich. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 17.01.2015, 21:30 Titel: |
|
|
Unter Linux und in C würde ich typischerweise für so etwas select() verwenden. select() hat die Aufgabe, einen Prozess schlafen zu legen, bis auf irgend einem Dateideskriptor (z.B. TCP/IP-Socket, Tastatur, serieller Port usw.) Zeichen zum Abholen vorliegen.
Details (nur Linux):
Wäre vielleicht für FB auch einmal ein sinnvoller Feature Request, dass ich mit OPEN auch beliebige Ressourcen gleichzeitig öffnen und Prozess schlafen legen könnte, bis eine beliebige Eingabe vorliegt.
Mit den jetzigen Möglichkeiten einen Versuch wert: Je ein Thread für jede Ressource bereitstellen, also einer, der nur ständig Zeichen am COM-Port abfragt, ein anderer, der die Tastatur bedient usw. => bedingt ein Arbeiten mit Mutexe für den kritischen Abschnitt, wo auf die gemeinsamen Variablen zugegriffen wird. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 19.01.2015, 20:44 Titel: |
|
|
du könntest ja auch einfach alles so machen, wie bisher. Allerdings beim empfang eines bytes eine do-loop laufen lassen, bis nichts mehr im speicher liegt.
alternativ wäre z.B. auch eine möglichkeit mit einem timer() zu arbeiten.
http://ops.deltalabs.de/code?id=14
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 20.01.2015, 12:52 Titel: |
|
|
@TPM
Zitat: | alternativ wäre z.B. auch eine möglichkeit mit einem timer() zu arbeiten. | Gute Idee!
Deine Einschätzung der Durchläufe in deinem Beispiel ist allerdings nicht richtig.
Mit einer recht lahmen CPU komme ich auf wesentlich höhere Werte.
Code: | Dim lauf As Integer
Dim As Double zeit, zeit1 = Timer +1.0
Do
If zeit <= Timer Then 'ohne Timer 66 Durchlaeufe pro sek.
Sleep 1,1 'entlastet die CPU
'zeit = Timer + 0.001 'ca. 15100 Durchlaeufe pro sek.
zeit = Timer + 0.01 'ca. 150000 Durchlaeufe pro sek.
'zeit = Timer + 0.1 'ca. 220000 Durchlaeufe pro sek.
End If
lauf +=1
Loop While zeit1 >= Timer
? lauf
Sleep |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 20.01.2015, 13:40 Titel: |
|
|
joar ... das war damals n denkfehler ... die werte sind nicht so einfach abzuschetzen, da man die leistung der cpu ja nicht kennt *g*
werd ich mal bei gelegenheit editieren *gg*
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
|