[Python] Waar vind ik een goede tutorial

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Zilverdael80
  • Registratie: December 2006
  • Laatst online: 02-10 12:41
TLDR: Ik zoek een goede tutorial voor pyserial icm threading en data analyse

Zelfs het uitleggen van het probleem blijkt lastig, so bare with me...

Ik ben momenteel bezig om op mijn werk Procomm Plus (ontwikkeling gestopt in 1999) te vervangen voor een (nog zelf te maken) Python programma.
Mensen die bekend zijn met Procomm Plus weten het al ongeveer, voor de rest:
Procomm Plus is een terminal programma (een beetje zoals Putty) maar mer script mogelijkheden.
Wij draaien nu een script van ruim 55k+ regels om 550+ verschillende parts te testen.
Procomm Plus heeft inmiddels wat moeite met de grootte van de code en onze wensen zijn inmiddels ook wat gegroeid, dingen zoals database integratie, betere data analyse van de input etc zijn steeds wenselijker.
Het geweldige aan Procomm Plus is dat het 'gewoon werkt', je sluit een unit aan op COMx, connect en gaan. Tot en met BIOS interfaces (ANSI codes) aan toe.
Natuurlijk ben ik al flink aan de slag gegaan om te kijken wat ik zelf voor elkaar kan krijgen, maar ik loop telkens weer stuk. Of threading update is RAM traag, of the ANSI wordt niet gedecode, etc. etc.
Ik heb wat hulp gevraagd aan ChatGPT, maar daar wordt ik echt geen vrienden mee. Vraag A met opties B en C, breidt uit naar D en hij laat optie C vervallen. Waardeloze tool in mijn handen.
Maargoed, het beste is natuurlijk zelf schrijven.
Ik kan echter gewoon nergens een duidelijke tutorial vinden hoe ik dit moet starten.

Nodig:
- GUI, kan ik denk ik redelijk zelf bouwen
- Serial receive -> GUI terminal venster
-- waitfor "x" in de serial receive. (en dit moet vaak worden aangeroepen, met timeout etc.)
-- send "y" naar de serial (inclusief 'delete' 'escape' en functietoetsen, nog niet gelukt)
-- waitfor / send etc. etc. etc.

Uiteindelijk moeten er nog veel meer functies komen die de data buffert zodat ik die later terug kan lezen voor data analyze (bijvoorbeeld een rapport wordt via de serial verstuurd, die wordt gebufferd, geanalyseerd en op basis van het resultaat doe "x" of "y")


...
Hard/Software
Python 3.12 / Windows10/11 machines.
Code moet op meerdere machines gaan draaien, maar allemaal Windows 10+ based.
...

Zelf gevonden
https://www.youtube.com/p...Z-meHdTlzqCHGPjZvnL2VZVn8
Hiermee ben ik gestopt, erg toffe uitleg, helder en duidelijk, maar hetgeen ik nodig heb op seriele communicatie is niet wat hier afspeelt.

Meerdere andere filmpjes op het net gevonden, maar die komen nog niet eens in de buurt van bovenstaande.

Wie heeft hier ervaring mee, heeft iets moois op het net gevonden en kan mij net dat éne zetje in de goede richting geven om verder te komen?

Alle reacties


Acties:
  • 0 Henk 'm!

  • Zilverdael80
  • Registratie: December 2006
  • Laatst online: 02-10 12:41
Update:
Qua ANSI formating heb ik het nu voor elkaar. coloroma is het magische woord.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import os
os.system('title Terminal window')

from collections import deque
import threading

import colorama
import click
import serial
from serial.tools import list_ports

def run(port, baudrate, parity='N', stopbits=1):
    try:
        device = serial.Serial(port=port,
                                baudrate=baudrate,
                                bytesize=8,
                                parity=parity,
                                stopbits=stopbits,
                                timeout=0.1)
    except:
        print('--- Failed to open {} ---'.format(port))
        return 0

    print('--- {} is connected. Press Ctrl+] to quit ---'.format(port))
    queue = deque()
    def read_input():
        from msvcrt import getch

        while device.is_open:
            ch = getch()
            if ch == b'\x1d':                   # 'ctrl + ]' to quit
                break
            if ch == b'\x00' or ch == b'\xe0':  # arrow keys' escape sequences
                ch2 = getch()
                esc_dict = { b'H': b'A', b'P': b'B', b'M': b'C', b'K': b'D', b'G': b'H', b'O': b'F' }
                if ch2 in esc_dict:
                    queue.append(b'\x1b[' + esc_dict[ch2])
                else:
                    queue.append(ch + ch2)
            else:  
                queue.append(ch)

    colorama.init()

    thread = threading.Thread(target=read_input)
    thread.start()
    while thread.is_alive():
        try:
            length = len(queue)
            if length > 0:
                device.write(b''.join(queue.popleft() for _ in range(length)))

            line = device.readline()
            if line:
                print(line.decode(errors='replace'), end='', flush=True)
                if b"to enter setup" in line:
                    device.write(b'\x1b\x4f\x51') # This one actually sends a working F2 button!
        except IOError:
            print('--- {} is disconnected ---'.format(port))
            break

    device.close()
    if thread.is_alive():
        print('--- Press R to reconnect the device, or press Enter to exit ---')
        thread.join()
        if queue and queue[0] in (b'r', b'R'):
            return 1
    return 0


CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])

@click.command(context_settings=CONTEXT_SETTINGS)
@click.option('-p', '--port', default=None, help='serial port name')
@click.option('-b', '--baudrate', default=115200, help='set baud reate')
@click.option('--parity', default='N', type=click.Choice(['N', 'E', 'O', 'S', 'M']), help='set parity')
@click.option('-s', '--stopbits', default=1, help='set stop bits')
@click.option('-l', is_flag=True, help='list serial ports')
def main(port, baudrate, parity, stopbits, l):
    if port is None:
        ports = list_ports.comports()
        if not ports:
            print('--- No serial port available ---')
            return
        if len(ports) == 1:
            port = ports[0][0]
        else:
            print('--- Available Ports ----')
            for i, v in enumerate(ports):
                print('---  {}: {} {}'.format(i, v[0], v[2]))
            if l:
                return
            raw = input('--- Select port index: ')
            try:
                n = int(raw)
                port = ports[n][0]
            except:
                return

    while run(port, baudrate, parity, stopbits):
        pass

if __name__ == "__main__":
    main()


Ik heb nu werkende code in de zin van; de (meeste) keystrokes worden goed doorgevoerd.
Er zit in een enkele 'waitfor' in (en nee, die hoort daar natuurlijk niet) met een succesvolle 'F2' keystroke send.
(daarmee kon ik zowel de input 'controleren' als de key 'sturen' én de layout van het BIOS menu controleren)

Wat ik nu dus zoek is een 'schil' die hier omheen kan waarin ik dus 'waitfor', 'transmit' functies kan zetten en uiteindelijk een geheel script van waitfors, transmits etc kan maken.

Idealiter zou er ook iets van een buffer.start, buffer.read en buffer.stop moeten komen die (sinds de start) alle inkomende data opslaan in een buffer die vervolgens doorgespit kan worden zoekend naar data. buffer.stop maakt hem netjes leeg om te voorkomen dat er geheugenproblemen komen.

[ Voor 67% gewijzigd door Zilverdael80 op 19-03-2024 16:08 ]