msdn16_capa.jpg

Clique aqui para ler todos os artigos desta edição

 

Comunicação Serial com P/Invoke no .NET

por John Hind

Este artigo discute

Este artigo usa as seguintes tecnologias:

·          Comunicação com dispositivos através da serial

C#, comunicações RS232

 

Download:

NetSerialComm.exe (89KB)

Chapéu

Porta Serial

 

 

Sem fazer alterações, a única maneira de codificar aplicativos de comunicação serial RS232 no ambiente .NET é importando o controle ActiveX desatualizado e, de certa forma, limitado, MSComm. Este artigo descreve o desenvolvimento de uma biblioteca de classes RS232 simples, básicas, multitarefa e moderna em código C# gerenciado. A biblioteca usa Platform Invocation Services para interagir diretamente com a API do Win32. Os programadores de aplicativos poderão usar a biblioteca a partir de qualquer linguagem  .NET através de herança; o artigo explora exemplos escritos em C# e Visual Basic .NET.

A Microsoft® .NET Framework Class Library (FCL) oferece uma cobertura abrangente dos recursos da Win32® API básica, contribuindo bastante para a sofisticação das linguagens C# e Visual Basic® .NET. Contudo, a comunicação serial RS232 é uma área que está claramente ausente da biblioteca. Para ser honesto, hoje a maioria das pessoas provavelmente considera essas portas como bagagem de legado. Hoje em dia você interage com modems seriais via camadas de software como TAPI ou PPP. Outros dispositivos que um dia usaram essas portas estão agora migrando para USB. De qualquer forma, a necessidade de drivers de dispositivo para dispositivos RS232 especializados como receptores GPS, leitores de código de barras e cartões, controladores programáveis e programadores de dispositivos, permanecerão no futuro previsível.

O Platform Invocation Services (P/Invoke) é a tecnologia .NET que habilita o código gerenciado no common language runtime (CLR) para fazer chamadas em DLLs não gerenciadas, incluindo aquelas que implementam a API do Win32. Neste artigo envolverei as funções de API fornecidas para comunicações RS232 em classes CLR gerenciadas, usando C#. A biblioteca de classes básicas resultante tornará relativamente fácil o desenvolvimento de drivers para dispositivos específicos, usando qualquer linguagem .NET. O código completo da biblioteca e exemplos está disponível para download no site da revista.

 

Princípios de design

Há pelo menos quatro opções de design que você deve considerar ao encapsular as funções de comunicações seriais do Win32 em classes gerenciadas:

1. Usar o P/Invoke para encapsular as funções de API, constantes e definições de estrutura como membros estáticos de uma classe gerenciada. Embora eu use esse método internamente, não exponho essa classe aos programadores de aplicativos.

2. Escrever um handler de stream. Trata-se de uma abstração generalizada, extensível, usada pela estrutura para comunicações de arquivos, console e rede. À primeira vista isto é atraente, mas um exame mais cuidadoso revela que é mais adequado às comunicações tradicionais via modem do que às sintaxes comando-resposta dos dispositivos seriais modernos.

3. Construir uma substituição direta pelo MSComm OLE Control Extension (OCX). Em outras palavras, crie uma classe que encapsule o handle de arquivo da API e forneça um número de métodos e eventos generalizados (Open, Close, Read, Write e assim por diante). Você poderia usar esses recursos instanciando um objeto da classe da biblioteca dentro da classe do aplicativo, ou seja, pro agregação, no estilo do COM.

4. Criar uma classe básica de que o código do aplicativo herde. Este é um método verdadeiramente baseado em objetos que explora o truque fantástico do .NET de herança de run-time independente de linguagem. Os métodos generalizados são herdados no objeto do aplicativo e nos métodos virtuais, em vez de nos eventos. O objeto do aplicativo oferece uma interface pública em termos apropriados ao dispositivo RS232 propriamente dito (por exemplo, um driver de receptor GPS poderia ter propriedades públicas para latitude e longitude).

Empregarei o quarto método. A biblioteca conterá duas dessas classes declaradas como abstratas (não podem ser instanciadas), mas eu as usarei como classes básicas para a construção de classes específicas de aplicativo por meio de legado. A Figura 1 ilustra a hierarquia do legado.

 

image001.gif ...

Quer ler esse conteúdo completo? Tenha acesso completo