Compartilhar via


Windows.Devices.SerialCommunication Namespace

O Windows.Devices.SerialCommunication namespace define Windows Runtime classes que um aplicativo UWP pode usar para se comunicar com um dispositivo que expõe uma porta serial ou alguma abstração de uma porta serial. As classes fornecem funcionalidade para descobrir esses dispositivos serial, ler e gravar dados e controlar propriedades específicas da série para o controle de fluxo, como definir a taxa de baud, estados de sinal.

Suporte ao dispositivo

Um dispositivo serial se exporá ao sistema pela propriedade DEVPKEY_Device_ClassGuid = {4d36e978-e325-11ce-bfc1-08002be10318} e criará um DeviceInterface com = DEVPKEY_DeviceInterface_ClassGuid{86e0d1e0-8089-11d0-9ce4-08003e301f73} ().GUID_DEVINTERFACE_COMPORT

O Windows dá suporte nativo a portas expostas por adaptadores serial para USB que pertencem à classe de dispositivo USB-CDC usando o driver de caixa de entrada usbser.sys (como as usadas no Arduino Uno R3s). As IDs compatíveis com USB-CDC são:

  • USB\Class_02&SubClass_02&Prot_01
  • USB\Class_02&SubClass_02

Outros adaptadores serial para USB (como FTDI/Prolific/Silicon-Labs) que expõem GUID_DEVINTERFACE_COMPORTs também têm suporte, mas exigem drivers adicionais específicos do fornecedor.

Portas serial marcadas como internas para o computador (DEVPKEY_Device_InLocalMachineContainer == TRUE) não são acessíveis, a menos que explictly marcadas pelo driver do fornecedor como irrestritas (DEVPKEY_DeviceInterface_Restricted == TRUE). Os dispositivos se conectam por meio da maioria dos cartões de expansão de porta PCI COM, portanto, não são acessíveis.

Portas serial inacessíveis ainda podem ser enumeradas por DeviceInformation.FindAllAsync(), mas não podem ser abertas por SerialDevice.FromIdAsync(). O attemping para abrir esse dispositivo gerará uma exceção ou retornará nulo. Os aplicativos devem lidar com esse caso filtrando essas portas seriais do modo de exibição do usuário, para que o usuário não possa interagir com uma porta serial sem suporte.

É possível que a coleção DeviceInformation retornada por DeviceInformation.FindAllAsync() possa ter um dispositivo serial cuja propriedade DeviceInformation.Name está definida como o nome do computador. Isso é por design e pode ocorrer ao enumerar uma porta serial integrada. Os aplicativos devem lidar com esse caso:

  • Filtrar essas portas seriais do modo de exibição do usuário, para que o usuário não possa interagir com uma porta serial sem suporte.
  • Se o aplicativo decidir permitir que o usuário interaja com essa porta serial, observe que quando o aplicativo chama a função DeviceAccessInformation.CreateFromId(), uma exceção com a mensagem: "O sistema não pode localizar o arquivo especificado. (Exceção de HRESULT: 0x80070002)" será gerada. O aplicativo deve lidar com essa exceção e informar ao usuário que a porta não tem suporte.

A política de acessibilidade/funcionalidade sempre pode ser substituída escrevendo um driver personalizado e correspondendo ao Aplicativo de Suporte a Hardware

Funcionalidades do dispositivo serial

Seu aplicativo UWP deve incluir determinadas funcionalidades de dispositivo em seu manifesto do pacote de aplicativos. Os recursos identificam o dispositivo e sua finalidade. Aqui estão os elementos necessários em ordem hierárquica:

Desde Windows 10, versão 1809 (Atualização de outubro de 2018)

Desde 1809, o vidpid e o tipo de função não precisam mais ser especificados e serão ignorados nesses sistemas. Se estiver direcionando sistemas antes de 1809, veja abaixo.

<DeviceCapability Name="serialcommunication"/>

Antes de Windows 10, versão 1809 (Atualização de outubro de 2018)

  • <DeviceCapability>: o atributo Name deve ser serialcommunication.

    • <Dispositivo>: o atributo Id deve especificar o identificador do dispositivo. Se você estiver usando um adaptador Serial para USB, a ID deverá especificar identificadores de fornecedor/produto ou pode ser "qualquer" para permitir o acesso a qualquer dispositivo que corresponda ao tipo de função.

      • <Função>: o atributo Type especifica a função do dispositivo. Para dispositivos serial, isso deve ser serialPort.
<DeviceCapability Name="serialcommunication">
    <Device Id="vidpid:xxxx xxxx">
      <Function Type="name:serialPort"/>
    </Device>
</DeviceCapability>

Exemplo de funcionalidade de dispositivo serial

Aqui está um exemplo para definir recursos de dispositivo serial. Ele permite que o aplicativo acesse a porta serial por meio de um adaptador Serial para USB.

<DeviceCapability Name="serialcommunication">
  <Device Id="vidpid:045E 0610">
    <Function Type="name:serialPort"/>
  </Device>
</DeviceCapability>

Solução de problemas

  • Verifique se a funcionalidade serial (serialcommunication) está no manifesto do aplicativo.
  • Verifique se o usuário concedeu permissão para o aplicativo utilizar dispositivos serial.
  • Os dispositivos internos do computador (DEVPKEY_Device_InLocalMachineContainer == TRUE) geralmente não são acessíveis. (por exemplo, cartões de expansão de porta PCI COM)
    • A menos que a propriedade DEVPKEY_DeviceInterface_Restricted de interface do dispositivo para seja definida FALSEcomo GUID_DEVINTERFACE_COMPORT , os dispositivos internos não estão acessíveis. Determinados drivers, especialmente em SKUs de IoT, podem definir essa propriedade como FALSE.
    • Se estiver acessando um controlador Serial com base em SerCx ou SerCx2 iniciando o Windows 10 1903 (Atualização de maio de 2019), o dispositivo poderá optar por estar diretamente acessível no modo de usuário ou habilitando RhProxy.
  • Essas restrições podem ser ignoradas ao criar um dispositivo personalizado trabalhando com o driver-desenvolvedor para criar um aplicativo de suporte de hardware

Classes

ErrorReceivedEventArgs

Representa o objeto que é passado como um parâmetro para o manipulador de eventos que é invocado quando ocorre um erro na porta serial.

PinChangedEventArgs

Representa o objeto que é passado como um parâmetro para o manipulador de eventos que é invocado quando o estado de uma linha de sinal é alterado na porta serial.

SerialDevice

Representa uma porta serial. O objeto fornece métodos e propriedades que um aplicativo pode usar para localizar e interagir com portas serial no sistema.

Enumerações

SerialError

Define valores para condições de erro que podem ocorrer na porta serial.

SerialHandshake

Define valores para protocolos de controle de fluxo de hardware e software usados na comunicação serial. Os valores são usados pela propriedade Handshake no objeto SerialDevice .

SerialParity

Define valores para o bit de paridade para a transmissão de dados serial. Os valores são usados pela propriedade Parity no objeto SerialDevice .

SerialPinChange

Define valores para tipos de alterações de estado de sinal na porta serial.

SerialStopBitCount

Define valores que indicam o número de bits de parada usados em uma transmissão. Os valores são usados pela propriedade StopBits no objeto SerialDevice .

Confira também