Dados de porta serial de 9 bits verdadeiros?

10

Eu tenho um projeto de máquina de vending semi-completo, em execução no UTC do Atmel, que quero portar para o Pi.

Para conversar com periféricos, como o aceitador de moedas, ele deve suportar o barramento multi-drop, que possui uma interface de porta serial de 9 bits (mais os bits de início, parada e paridade).

Aprendi da maneira mais difícil com a diretoria da Atmel que hacks sugeridos na rede, que dependem do uso do bit de paridade, já que o nono bit de dados pode causar problemas de tempo ruim - difíceis de detectar e corrigir (por isso, não consulte-me para isso , ou similar. Obrigado).

Alguém sabe se / onde eu posso comprar uma verdadeira porta serial de 9 bits para o Pi (pontos de bônus se, de alguma forma, funcionar com o Pi zero).

Existe, talvez, um chapéu disponível? Ou eu poderia facilmente (eu tenho o / as cara, com pouco conhecimento de h / w) usar outra placa para lidar com o UART de 9 bits e controlar isso de um Pi?

Mawg diz que restabelece Monica
fonte
11
Há uma interface serial no GPIO - nas imagens Raspbian etc., que foi configurada para fornecer saída do Pi, então você precisa desativá-lo primeiro, mas ainda assim terá um problema com os bits que não estão no intervalo padrão. Esta postagem nos fóruns também pode ajudar.
Wilf
11
Você pode adicionar hardware ao projeto? Um escudo com um UART não seria muito difícil de criar e forneceria exatamente o que você precisa, embora possa usar mais I / O do que vale a pena. Uma CPU PIC realmente low-end provavelmente poderia ser rapidamente programada para converter entre 8 e 9 bits seriais sem custar muito ou ser uma quantidade excessiva de trabalho para você.
Michael Kohne
Você sabia onde eu poderia comprar um?
Mawg diz que restabelece Monica

Respostas:

7

Minha biblioteca pigpio suporta a leitura e gravação de dados seriais de 9 bits. Ele usa bit bang para que você possa usar qualquer GPIO disponível.

Se bem me lembro, qualquer velocidade de 19,2 kbps ou mais lenta era bastante estável.

Quais bits por segundo você precisa?

Ler ( C , Python ) é um pouco mais fácil do que escrever ( C , Python ).

joan
fonte
11
Você tem 100 * de certeza? Quando eu comecei a desenvolver, fui avisado de tais "hacks" e me disseram que haveria problemas de tempo. Você sabe se alguém tentou com uma máquina de venda automática? pt.wikipedia.org/wiki/Multidrop_bus e coin-acceptor.com.cn/Upload/EditorFiles/technicalfile/… (desculpe, eu não posso dar um número de sectoin como estou atrás de um firewall da empresa)
Mawg diz que restaura Monica
3
A única experiência que tenho é usando a biblioteca entre o Pi e um laptop com um dongle serial USB. Os testes que fiz estão documentados em raspberrypi.stackexchange.com/questions/27488/… . Meu software usa apenas RX / TX e terra, portanto, se você fizer algo sofisticado com os outros sinais seriais, poderá ter problemas.
quer
Parece bom. : Deixe-me verificar as especificações e retornar para você
Mawg diz que restabelece Monica em 27/11/2015
2
@ Makg: você aceitou isso. Isso significa que a solução proposta funcionou de maneira confiável?
Thomas Weller
3

Fui designado a um projeto para executar uma máquina de venda automática de lanches que usa o protocolo MDB para pagamento e concluí o projeto usando Pi Zero (laranja).

Eu tentei bibliotecas seriais de hardware e software de 9 bits e tive problemas de temporização no Pi Zero. A comunicação serial de 9 bits do MDB se tornou uma dor. O protocolo MDB diz que os periféricos devem ter tolerância de% 5 para o tempo de comunicação serial, no entanto, diferentes fornecedores de periféricos têm tolerâncias diferentes, não compatíveis com o protocolo MDB. Quando você pensa que concluiu a comunicação serial, mas tenta um periférico de pagamento de outro fornecedor, simplesmente não funciona. Portanto, não confie na folha de dados do protocolo MDB. Fiquei cansado de implementar o controlador MDB para fornecedores de buggy. Além disso, alguns periféricos podem drenar quantidades excessivas de corrente dos pinos uart durante o processo de inicialização interna e podem danificar a camada de comunicação serial. Então, é melhor você usar uma abstração. Os acopladores ópticos estão bem, mas eu ainda não Recomenda o manuseio da comunicação serial MDB usando o Pi Zero. A melhor maneira é usar uma abordagem de camada intermediária usando um AVR.

Em vez de usar o Uart no Pi Zero para comunicação MDB, usei um AVR Atmega328 para manipulação, pesquisa etc. do MDB. O Atmega328 controla os periféricos do MDB usando a biblioteca Serial de Software e envia dados legíveis para o Pi Zero na série de hardware. Todo esquema eletrônico, fontes e imagem Pi Zero Armbian, código Python para operações de venda automática estão disponíveis aqui:

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

Você pode verificar a página da wiki para obter mais detalhes sobre o controle de motores, sensores de entrega de produtos, resfriadores e displays LCD de caracteres. É um projeto completo de controlador de máquina de venda automática e está sendo usado por alguns produtores de máquinas de venda automática.

Eliverse
fonte
Esta é uma resposta fantástica, especialmente porque é a primeira resposta. Eu já obtive sucesso com uma placa Atmel com um verdadeiro UART de 9 bits e esperava economizar dinheiro usando um Raspberry Pi, mas sua solução é tão abrangente que eu seria tolo em não usá-la. Infelizmente, eu sou apenas um cara de software, portanto, para um protótipo, eu preferiria fortemente uma solução necessária sem solda. Você pode recomendar uma placa COTS?
Mawg diz que restabelece Monica
Esta página do seu site diz "Se você concluiu as etapas em Criando uma placa Vendiverse VMC ou se você obteve uma placa Vendiverse VMC". Posso comprar um de você? Quanto isto custaria? Além disso, se você recomendar periféricos MDB específicos, poderá adicioná-lo ao seu site? Obrigado
Mawg diz restabelecer Monica
Parece que meus e-mails estão bloqueados no spam. Você pode entrar em contato comigo? Você tem meu endereço de e-mail e eu ainda estou em Bremen
diz Mawg, restabelece Monica
Agora parece que a página está morta e o projeto foi abandonado :-(
Mawg diz que restabelece Monica em 22/01/19
1

Todos os dados seriais são por definição, 1 bit. Cabe às interfaces que leem e escrevem esses dados como chegar a um acordo sobre como eles interpretam os bits de e para dados significativos.
Se você deseja 9 bits de dados, um bit de paridade e um bit de parada e início. Cabe a você converter seus dados para esse formato e interpretar os dados que você lê nesse formato. O módulo pigpio mencionado em outra resposta fornecerá a interface de hardware necessária ou você poderá escrever sua própria. Se você estiver desenvolvendo em python, sugiro dar uma olhada no módulo bitString.py de Scott Griffiths como uma biblioteca que facilita bastante a manipulação de dados baseados em bits.

Paul Smith
fonte
5
O problema com a transmissão de dados seriais está no tempo. Os dados não têm cronômetro interno e a única transição de nível garantida está nos bits de parada / partida. Ambas as extremidades precisam manter um tempo apertado e ininterrupto para descobrir onde estão os bits. É por isso que o hardware dedicado é geralmente usado para transmitir e receber os dados. Há pouca margem de tempo.
Joan
1

Definitivamente, prefiro o UART de hardware à implementação de software, como o pigpio.

Você pode usar o bit de paridade para comunicação de 9 bits. Há um pequeno problema: o kernel atual não tem suporte ao CMSPAR (paridade de espaço / marca).
Mas você pode alternar a paridade ímpar / ímpar para obter o valor do nono bit desejado, mesmo com o kernel atual, por exemplo:

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


Melhor abordagem O IMHO é usar o pequeno patch do kernel para suporte ao CMSPAR:
http://marc.info/?l=linux-serial&m=145706834101241&w=2
Ele adiciona suporte de paridade de marca / espaço, o que permite que o código seja um pouco mais simples.

PS: Eu implementei MDB sobre serial com essa abordagem. Funciona perfeitamente no Pi.
O patch do PPS foi aprovado e o CMSPAR funcionará imediatamente, começando com o kernel 4.6.

edo1
fonte
Sem o patch ou pelo menos um link, e detalhes mais completos, isso não é uma resposta nem um comentário útil - além de dizer que é teoricamente possível.
Steve Robillard
Ele ainda deixa mais perguntas do que respostas: como eu implemento o MDB, como aplico o patch do kernel, isso funcionará em todos os Pi's ou apenas em alguns deles? O que mais isso pode quebrar? Como posso desfazer isso, se necessário? Esse patch é seguro? Lembre-se de que você sabe disso porque implementou o OP não.
9788 Steve Rogillard
11
Anulei sua resposta, pois você admite que poderia ser melhor. Espero que você aproveite a oportunidade para melhorá-lo.
Steve Robillard
O que mais preciso adicionar? Implementação do MDB? Não recebi permissão de código aberto do meu empregador.
edo1
Veja meu comentário anterior e lembre-se de que o usuário final não sabe tudo o que você faz.
9788 Steve Robillard
1

Você não pode CONFIÁVEL RPI conexão em série directamente para o autocarro MDB devido ao formato de 9 bits e horários MDB estritas. As mensagens entre o MDB periférico e o RPi precisam ser convertidas on-the-fly e em tempo real. Verifique este link para ajudar: DIY MDB-UART converter

ivan ivanov
fonte