Vraies données de port série 9 bits?

10

J'ai un projet de distributeur automatique à moitié complet exécuté sur un Atmel UTC, que je souhaite porter sur le Pi.

Afin de parler aux périphériques, tels que l'accepteur de pièces, il doit prendre en charge le bus multipoint qui possède une interface de port série à 9 bits de données (plus les bits de démarrage, d'arrêt et de parité).

J'ai appris à la dure avec la carte Atmel qui pirate ce que l'on trouve suggéré sur le net, qui repose sur l'utilisation du bit de parité car le 9ème bit de données peut causer de mauvais problèmes de synchronisation - difficiles à détecter et à corriger (donc, s'il vous plaît ne le faites pas me référer à cela , ou similaire. Merci).

Est-ce que quelqu'un sait si / où je peux acheter un vrai port série 9 bits pour le Pi (points bonus s'il peut en quelque sorte fonctionner avec le Pi zéro).

Y a-t-il peut-être un chapeau disponible? Ou pourrais-je facilement (j'ai en tant que / w guy, avec peu de connaissances en h / w) utiliser une autre carte pour gérer l'UART à 9 bits de données et contrôler cela à partir d'un Pi?

Mawg dit réintégrer Monica
la source
1
Il y a une interface série sur le GPIO - sur les images Raspbian, etc., elle a été définie pour fournir une sortie du Pi, vous devez donc la désactiver d'abord, mais vous aurez toujours un problème avec les bits qui ne sont pas dans la plage standard. Ce message sur les forums peut également aider.
Wilf
1
Pouvez-vous ajouter du matériel au projet? Un bouclier avec un UART ne serait pas trop difficile à faire et vous donnerait exactement ce dont vous avez besoin, bien qu'il puisse utiliser plus d'E / S que ce qu'il vaut. Un processeur PIC vraiment bas de gamme pourrait probablement être rapidement programmé pour traduire entre 8 et 9 bits en série sans coûter trop cher ni être un travail excessif pour vous.
Michael Kohne
Savez-vous où je pourrais en acheter un?
Mawg dit réintégrer Monica le

Réponses:

7

Ma bibliothèque pigpio prend en charge la lecture et l'écriture de données série 9 bits. Il utilise le bit banging pour que vous puissiez utiliser n'importe quel GPIO disponible.

Si je me souviens bien, les vitesses de 19,2 kbps ou plus lentes étaient assez stables.

De quels bits par seconde avez-vous besoin?

La lecture ( C , Python ) est légèrement plus facile que l'écriture ( C , Python ).

joan
la source
1
Êtes-vous 100 * sûr? Quand j'ai commencé à développer, j'ai été averti de ces "hacks" et on m'a dit qu'il y aurait des problèmes de timing. Savez-vous si quelqu'un l'a essayé avec un distributeur automatique? en.wikipedia.org/wiki/Multidrop_bus et coin-acceptor.com.cn/Upload/EditorFiles/technicalfile/… (désolé, je ne peux pas donner de numéro de sectoin car je suis derrière un pare-feu d'entreprise)
Mawg dit rétablir Monica
3
La seule expérience que j'ai utilise la bibliothèque entre le Pi et un ordinateur portable avec un dongle série USB. Les tests que j'ai effectués sont documentés dans raspberrypi.stackexchange.com/questions/27488/… . Mon logiciel utilise uniquement RX / TX et la masse, donc si vous faites quelque chose de fantaisiste avec les autres signaux série, vous pouvez avoir des problèmes.
joan
Ça m'a l'air bien. : Permettez-moi de vérifier les spécifications et de vous revenir
Mawg dit de réintégrer Monica
2
@Mawg: vous l'avez accepté. Cela signifie-t-il que la solution proposée a fonctionné de manière fiable?
Thomas Weller
3

On m'a confié un projet pour gérer un distributeur automatique de collations qui utilise le protocole MDB pour le paiement et j'ai terminé le projet en utilisant Pi Zero (Orange).

J'ai essayé des bibliothèques matérielles et logicielles série 9 bits et j'ai eu des problèmes de synchronisation sur Pi Zero. La communication série 9 bits de MDB est devenue une douleur. Le protocole MDB indique que les périphériques devraient avoir une tolérance de 5% pour le calendrier de communication série, mais différents fournisseurs de périphériques ont des tolérances différentes, non conformes au protocole MDB. Lorsque vous pensez que vous avez effectué une communication série mais essayez un périphérique de paiement d'un autre fournisseur, cela ne fonctionne tout simplement pas. Ne vous fiez donc pas à la fiche technique du protocole MDB. Je suis tombé malade et fatigué d'implémenter le contrôleur MDB pour les vendeurs de buggy. Certains périphériques peuvent également drainer des quantités excessives de courant provenant des broches uart pendant leur processus de démarrage interne et peuvent endommager votre couche de communication série. Donc, il vaut mieux utiliser une abstraction. Les optocoupleurs sont bien mais je ne le ferais toujours pas Nous vous recommandons de gérer la communication série MDB à l'aide de Pi Zero. Le meilleur moyen est d'utiliser une approche de couche intermédiaire à l'aide d'un AVR.

Plutôt en utilisant Uart sur Pi Zero pour la communication MDB, j'ai utilisé un AVR Atmega328 pour la gestion, l'interrogation, etc. Tous les schémas électroniques, les sources et l'image Pi Zero Armbian, le code Python pour les opérations de vente sont disponibles ici:

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

Vous pouvez consulter la page wiki pour plus de détails sur le contrôle des moteurs, des capteurs de distribution de produits, des refroidisseurs et des écrans LCD à caractères. Il s'agit d'un projet complet de contrôleur de distributeur automatique et il est utilisé par quelques producteurs de distributeurs automatiques.

Eliverse
la source
C'est une réponse fantastique, d'autant plus que c'est une première réponse. J'ai déjà eu du succès avec une carte Atmel avec un véritable UART 9 bits et j'avais espéré économiser de l'argent en utilisant un Raspberry Pi, mais votre solution est si complète que je serais idiot de ne pas l'utiliser. Hélas, je suis un logiciel uniquement, donc pour un prototype, je préférerais fortement une solution requise sans soudure. Pouvez-vous recommander une carte COTS?
Mawg dit réintégrer Monica
Cette page de votre site Web indique "Si vous avez terminé les étapes de fabrication d'une carte VMC Vendiverse ou si vous avez obtenu une carte VMC Vendiverse". Puis-je en acheter un chez vous? Combien cela coûterait? De plus, si vous recommandez des périphériques MDB particuliers, pourriez-vous ajouter cela à votre site? Merci
Mawg dit de réintégrer Monica
Il semble que mes e-mails restent coincés dans votre spam. Pouvez-vous me contacter? Vous avez mon adresse e-mail et je suis toujours à Brême
Mawg dit de réintégrer Monica le
Maintenant, il semble que la page soit morte et le projet abandonné :-(
Mawg dit réintégrer Monica le
1

Toutes les données série sont par définition de 1 bit. C'est aux interfaces qui lisent et écrivent ces données comment se mettre d'accord sur la façon dont elles interprètent les bits vers et à partir de données significatives.
Si vous voulez 9 bits de données, et un bit de parité, et un bit d'arrêt et un bit de début. Ensuite, c'est à vous de convertir vos données dans ce format et d'interpréter les données que vous lisez dans ce format. Le module pigpio mentionné dans une autre réponse vous donnera l'interface matérielle dont vous avez besoin, ou vous pouvez écrire le vôtre. Si vous développez en python, je vous suggère de jeter un œil au module bitString.py de Scott Griffiths comme une bibliothèque qui facilite la manipulation des données basées sur les bits.

Paul Smith
la source
5
Le problème avec la transmission de données série est dans le timing. Les données ne sont pas auto-synchronisées et la seule transition de niveau garantie se trouve dans les bits d'arrêt / démarrage. Les deux extrémités doivent maintenir un timing serré et non nécessaire pour déterminer où se trouvent les bits. C'est pourquoi du matériel dédié est généralement utilisé pour transmettre et recevoir les données. Il y a peu de marge de manœuvre.
joan
1

Je préfère définitivement l'UART matériel à l'implémentation logicielle comme le fait pigpio.

Vous pouvez utiliser un bit de parité pour une communication 9 bits. Il y a un petit problème: le noyau actuel ne prend pas en charge CMSPAR (parité espace / marque).
Mais vous pouvez changer la parité paire / impaire pour obtenir la valeur de 9ème bit souhaitée même avec le noyau actuel, par exemple:

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);
}


Une meilleure approche à mon humble avis est d'utiliser un petit patch de noyau pour le support CMSPAR:
http://marc.info/?l=linux-serial&m=145706834101241&w=2
Il ajoute un support de parité marque / espace, ce qui permet au code d'être un peu plus simple.

PS J'ai implémenté MDB sur série avec cette approche. Cela fonctionne parfaitement sur Pi.
Le correctif PPS a été approuvé et CMSPAR fonctionnera prêt à l'emploi à partir du noyau 4.6.

edo1
la source
Sans le patch ou au moins un lien, et des détails plus complets, ce n'est pas une réponse, ni même un commentaire utile - à part cela, il est théoriquement possible.
Steve Robillard
Cela laisse toujours plus de questions que de réponses: Comment puis-je implémenter MDB, comment appliquer le patch du noyau, cela fonctionnera-t-il sur tous les Pi ou seulement certains d'entre eux? Quoi d'autre cela pourrait-il casser? Comment puis-je annuler cela si nécessaire? Ce patch est-il sûr? N'oubliez pas que vous le savez parce que vous l'avez mis en œuvre, ce que l'OP n'a pas.
Steve Robillard
1
J'ai annulé votre réponse, car vous admettez que votre réponse pourrait être meilleure. J'espère que vous en profiterez pour l'améliorer.
Steve Robillard
Que dois-je ajouter? Mise en œuvre de MDB? Je n'ai pas obtenu l'autorisation de l'open source de mon employeur.
edo1
Voir mon commentaire précédent et rappelez-vous que l'utilisateur final ne sait pas tout ce que vous faites.
Steve Robillard
1

Vous ne pouvez pas FIABLE série de connexion IPD directement au bus MDB dû au format 9 bits et les horaires de MDB strictes. Les messages entre le périphérique MDB et RPi doivent être convertis à la volée et en temps réel. Vérifiez ce lien, cela vous aidera: Convertisseur DIY MDB-UART

ivan ivanov
la source