Veri dati della porta seriale a 9 bit?


10

Ho un progetto di distributore automatico mezzo completo esistente in esecuzione su un UTC Atmel, che voglio portare sul Pi.

Per comunicare con le periferiche, come ad esempio il gettoniera, deve supportare il bus multi-drop che ha un'interfaccia della porta seriale a 9 bit (oltre ai bit di avvio, arresto e parità).

Ho imparato a fondo con la scheda Atmel che hacking quello che si trova suggerito in rete, che si basano sull'uso del bit di parità in quanto il nono bit di dati può causare problemi di tempismo - difficili da rilevare e correggere (quindi, per favore, non farlo riferiscimi a questo o simili. Grazie).

Qualcuno sa se / dove posso acquistare una vera porta seriale a 9 bit per il Pi (punti bonus se in qualche modo può funzionare con il Pi zero).

C'è forse un cappello disponibile? O potrei facilmente (ho come / w guy, con poca conoscenza di h / w) utilizzare un'altra scheda per gestire il UART a 9 bit di dati e controllarlo da un Pi?


1
C'è un'interfaccia seriale su GPIO - sulle immagini di Raspbian ecc. È stata impostata per fornire output dal Pi, quindi devi prima disabilitarla, ma avrai ancora un problema con i bit che non sono nell'intervallo standard. Anche questo post sui forum può essere d'aiuto.
Wilf,

1
Puoi aggiungere hardware al progetto? Uno scudo con un UART non sarebbe troppo difficile da realizzare e ti darebbe esattamente ciò di cui hai bisogno, anche se potrebbe usare più I / O di quanto valga la pena. Una CPU PIC davvero di fascia bassa potrebbe probabilmente essere rapidamente programmata per tradurre tra 8 e 9 bit seriali senza costare troppo o essere una quantità eccessiva di lavoro per te.
Michael Kohne,

Sai dove potrei comprarne uno?
Mawg dice di ripristinare Monica l'

Risposte:


7

La mia libreria pigpio supporta la lettura e la scrittura di dati seriali a 9 bit. Utilizza il bit banging in modo da poter utilizzare qualsiasi GPIO disponibile.

Se ricordo bene qualsiasi velocità di 19,2 kbps o più lenta era abbastanza stabile.

Di quali bit al secondo hai bisogno?

La lettura ( C , Python ) è leggermente più semplice della scrittura ( C , Python ).


1
Ne sei sicuro *? Quando ho iniziato a sviluppare, sono stato avvisato di tali "hack" e mi è stato detto che ci sarebbero stati problemi di tempistica. Sai se qualcuno l'ha provato con un distributore automatico? en.wikipedia.org/wiki/Multidrop_bus e coin-acceptor.com.cn/Upload/EditorFiles/technicalfile/… (mi dispiace, non posso fornire un numero di sectoin perché sono dietro un firewall aziendale)
Mawg dice di reintegrare Monica

3
L'unica esperienza che ho è di usare la libreria tra il Pi e un laptop con un dongle seriale USB. I test che ho fatto sono documentati in raspberrypi.stackexchange.com/questions/27488/… . Il mio software utilizza solo RX / TX e ground, quindi se fai qualcosa di fantasia con gli altri segnali seriali potresti avere problemi.
joan

Suona bene. : Fammi controllare le specifiche e
risponderti

2
@Mawg: hai accettato questo. Significa che la soluzione proposta ha funzionato in modo affidabile?
Thomas Weller,

3

Mi è stato assegnato un progetto per eseguire un distributore automatico di snack che utilizza il protocollo MDB per il pagamento e ho completato il progetto usando Pi Zero (Orange).

Ho provato librerie seriali hardware e software a 9 bit e ho avuto problemi di temporizzazione su Pi Zero. La comunicazione seriale a 9 bit di MDB è diventata una seccatura. Il protocollo MDB afferma che le periferiche dovrebbero avere una tolleranza del 5% per i tempi di comunicazione seriale, tuttavia i diversi fornitori di periferiche hanno tolleranze diverse, non conformi al protocollo MDB. Quando pensi di aver realizzato la comunicazione seriale ma provi una periferica di pagamento di un altro fornitore, semplicemente non funziona. Quindi non fare affidamento sul foglio dati del protocollo MDB. Mi sono stancato di implementare il controller MDB per i venditori di buggy. Inoltre, alcune periferiche possono scaricare troppi caratteri di corrente dai pin uart durante il processo di avvio interno e potrebbero danneggiare il livello di comunicazione seriale. Quindi, è meglio usare un'astrazione. Gli accoppiatori ottici vanno bene, ma ancora non vorrei t consiglia di gestire la comunicazione seriale MDB utilizzando Pi Zero. Il modo migliore è usare un approccio di livello intermedio usando un AVR.

Piuttosto usando Uart su Pi Zero per la comunicazione MDB, ho usato un AVR Atmega328 per gestione MDB, polling, ecc. Atmega328 controlla le periferiche MDB utilizzando la libreria Serial Software e invia dati leggibili dall'uomo a Pi Zero su seriale hardware. Tutti gli schemi elettronici, le fonti e l'immagine Pi Zero Armbian, il codice Python per le operazioni di vendita sono disponibili qui:

http://eliverse.com/content/vendiverse/

È possibile consultare la pagina wiki per ulteriori dettagli sul controllo di motori, sensori di consegna del prodotto, dispositivi di raffreddamento e display LCD a caratteri. È un progetto completo di controller di distributori automatici e viene utilizzato da una coppia di produttori di distributori automatici.


Questa è una risposta fantastica, soprattutto perché è una prima risposta. In precedenza avevo avuto successo con una scheda Atmel con un vero UART a 9 bit e speravo di risparmiare denaro utilizzando un Raspberry Pi, ma la tua soluzione è così completa che sarei un pazzo a non usarlo. Ahimè, sono un ragazzo solo software, quindi per un prototipo preferirei fortemente una soluzione richiesta senza saldature. Potete consigliarmi una scheda COTS?
Mawg dice di reintegrare Monica il

Questa pagina del tuo sito web dice "Se hai completato i passaggi nella creazione di una scheda VMC Vendiverse o se hai ottenuto una scheda VMC Vendiverse". Posso acquistarne uno da te? Quanto costerebbe? Inoltre, se raccomandi particolari periferiche MDB, potresti aggiungerlo al tuo sito? Grazie
Mawg dice di ripristinare Monica il

Sembra che le mie e-mail si stiano bloccando nel tuo spam. Puoi mettermi in contatto con me? Hai il mio indirizzo e-mail e sono ancora a Brema
Mawg dice di ripristinare Monica il

Ora sembra che la pagina sia morta e il progetto abbandonato :-(
Mawg dice di reintegrare Monica il


1

Tutti i dati seriali sono per definizione 1 bit. Spetta alle interfacce leggere e scrivere quei dati su come concordare il modo in cui interpretano i bit da e verso i dati significativi.
Se si desidera 9 bit di dati, un bit di parità e un bit di stop e di inizio. Quindi sta a te convertire i tuoi dati in quel formato e interpretare i dati che leggi in quel formato. Il modulo pigpio menzionato in un'altra risposta ti fornirà l'interfaccia hardware di cui hai bisogno o puoi scriverne uno tuo. Se stai sviluppando in Python, ti suggerisco di dare un'occhiata al modulo bitString.py di Scott Griffiths come una libreria che rende abbastanza facile manipolare i dati basati su bit.


5
Il problema con la trasmissione di dati seriali è nei tempi. I dati non sono auto-clock e l'unica transizione di livello garantita è nei bit di stop / start. Entrambe le estremità devono mantenere un tempismo stretto e non supportato per capire dove si trovano i bit. Ecco perché l'hardware dedicato viene generalmente utilizzato per trasmettere e ricevere i dati. C'è poco margine di manovra temporale.
joan

1

Preferisco decisamente UART hardware rispetto all'implementazione software come fa pigpio.

È possibile utilizzare il bit di parità per la comunicazione a 9 bit. C'è un piccolo problema: l'attuale kernel non ha il supporto CMSPAR (spazio / segno di parità).
Ma potresti cambiare la parità pari / dispari per ottenere il valore del 9 ° bit desiderato anche con il kernel corrente, ad esempio:

unsigned char check_parity(unsigned char v)
{
    v ^= v >> 4;
    v &= 0xf;
    return (0x6996 >> ((v ^ (v >> 4)) & 0xf)) & 1;
}

/* send 9 bits - 8 bits of byte + 1 bit of parity */
send_byte_with_parity(unsigned char byte, unsigned char parity)
{
    if (check_parity(byte) == parity) {
        options.c_cflag &= ~PARODD;
    } else {
        options.c_cflag |= PARODD;
    }
    tcsetattr(fd, 0, &options);
    write(fd, &byte, 1);
}


Un approccio migliore IMHO consiste nell'utilizzare una piccola patch del kernel per il supporto CMSPAR:
http://marc.info/?l=linux-serial&m=145706834101241&w=2
Aggiunge il supporto di parità mark / space, che consente al codice di essere un po 'più semplice.

PS Ho implementato MDB su seriale con questo approccio. Funziona perfettamente su Pi.
La patch PPS è stata approvata e CMSPAR funzionerà immediatamente a partire dal kernel 4.6.


Senza la patch o almeno un link e dettagli più completi questa non è una risposta, né è nemmeno un commento utile - a parte il fatto che è teoricamente possibile.
Steve Robillard

Resta ancora più domande che risposte: come posso implementare MDB, come posso applicare la patch del kernel, funzionerà su tutti i Pi o solo su alcuni di essi? Cos'altro potrebbe rompersi? Come posso annullare questo se necessario? Questa patch è sicura? Ricorda che lo sai perché l'hai implementato nel PO.
Steve Robillard

1
Ho annullato la tua risposta, poiché ammetti che la tua risposta potrebbe essere migliore. Spero che ne approfitterai per migliorarlo.
Steve Robillard,

Cos'altro devo aggiungere? Implementazione MDB? Non ho avuto il permesso di open-source dal mio datore di lavoro.
edo1,

Vedi il mio commento precedente e ricorda che l'utente finale non sa tutto quello che fai.
Steve Robillard,

1

Non è possibile AFFIDABILE collegare la seriale RPi direttamente al bus MDB a causa del formato a 9 bit e dei rigidi tempi MDB. I messaggi tra la periferica MDB e RPi devono essere convertiti al volo e in tempo reale. Controlla questo link che ti aiuterà: convertitore MDB-UART fai-da-te


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.