Pergunta

Estou tentando abrir e ler a partir de uma porta serial usando a classe System.IO.Ports.SerialPort. Eu arrastei a porta serial do painel de ferramenta (VS 2008) sobre a minha forma janelas. Eu tenho uma grade de propriedade configurado para que eu possa alterar as propriedades da porta serial em tempo de execução. Quando tento abrir a porta, eu recebo o erro mostrado abaixo. Eu não entendo por que, porque eu posso abrir e ler a partir do porto usando Hyperterminal. Alguma idéia?

System.IO.IOException Error connection: A device attached to the system is not functioning
   at System.IO.Ports.InternalResources.WinIOError(Int32 errorCode, String str)
   at System.IO.Ports.InternalResources.WinIOError()
   at System.IO.Ports.SerialStream.set_DtrEnable(Boolean value)
   at System.IO.Ports.SerialStream..ctor(String portName, Int32 baudRate, Parity parity, Int32 dataBits, StopBits stopBits, Int32 readTimeout, Int32 writeTimeout, Handshake handshake, Boolean dtrEnable, Boolean rtsEnable, Boolean discardNull, Byte parityReplace)
   at System.IO.Ports.SerialPort.Open()
   at Test.CardReader.frmMain.Connect() in D:\Develop\2.0\Projects\Kiosk\EmbeddedBrowser\Windows Forms\Test.CardReader\Form1.cs:line 166

Note, esta é uma conexão USB por isso é actuall uma porta serial virtual Minhas definições são as seguintes:
BaudRate = 9600
Databits = 8
DiscardNull = false
DtrEnable = false
Handshake = None
Paridade = Nenhum
ParityReplace = 63
PortName = COM3
ReadBufferSize = 4096
ReadTimeout = -1
ReceivedBytes = 1 | TrsEnable = false
Stopbits = Um
WriteBufferSize = 2048
WriteTimeout = -1

Eu transferi Portmon da Sysinternals. Eu capturado 2 logs, o primeiro é o log como o que acontece quando Hyperterminal abre a porta, o segundo é o que happends quando as tentativas de classe .net SerialPort para abrir a porta:

Hyperterminal:

IRP_MJ_CREATE                   USBSER000   SUCCESS         Options: Open 
IOCTL_SERIAL_SET_QUEUE_SIZE     USBSER000   SUCCESS         InSize: 8192 OutSize: 8192
IOCTL_SERIAL_CONFIG_SIZE        USBSER000   SUCCESS         Size: 0
IOCTL_SERIAL_GET_BAUD_RATE      USBSER000   SUCCESS 
IOCTL_SERIAL_GET_LINE_CONTROL   USBSER000   SUCCESS 
IOCTL_SERIAL_GET_CHARS          USBSER000   SUCCESS 
IOCTL_SERIAL_GET_HANDFLOW       USBSER000   SUCCESS 
IOCTL_SERIAL_GET_BAUD_RATE      USBSER000   SUCCESS 
IOCTL_SERIAL_GET_LINE_CONTROL   USBSER000   SUCCESS 
IOCTL_SERIAL_GET_CHARS          USBSER000   SUCCESS 
IOCTL_SERIAL_GET_HANDFLOW       USBSER000   SUCCESS 
IOCTL_SERIAL_SET_BAUD_RATE      USBSER000   SUCCESS         Rate: 9600
IOCTL_SERIAL_SET_RTS            USBSER000   SUCCESS 
IOCTL_SERIAL_SET_DTR            USBSER000   * 0xC0000001    
IOCTL_SERIAL_SET_LINE_CONTROL   USBSER000   SUCCESS         StopBits: 1 Parity: NONE WordLength: 8
IOCTL_SERIAL_SET_CHAR           USBSER000   SUCCESS         EOF:1a ERR:0 BRK:0 EVT:1a XON:f6 XOFF:6
IOCTL_SERIAL_SET_HANDFLOW       USBSER000   SUCCESS         Shake:80000001 Replace:80000040 XonLimit:80 XoffLimit:200
IOCTL_SERIAL_SET_TIMEOUTS       USBSER000   SUCCESS         RI:10 RM:0 RC:0 WM:0 WC:5000
IOCTL_SERIAL_SET_WAIT_MASK      USBSER000   SUCCESS         Mask: RLSD ERR 
IOCTL_SERIAL_GET_MODEMSTATUS    USBSER000   SUCCESS 
IOCTL_SERIAL_WAIT_ON_MASK       USBSER000       
IRP_MJ_READ USBSER000                                       Length 80

.Net SerialPort:

IRP_MJ_CREATE                   USBSER000   SUCCESS Options: Open 
IOCTL_SERIAL_GET_PROPERTIES     USBSER000   SUCCESS 
IOCTL_SERIAL_GET_MODEMSTATUS    USBSER000   SUCCESS 
IOCTL_SERIAL_GET_BAUD_RATE      USBSER000   SUCCESS 
IOCTL_SERIAL_GET_LINE_CONTROL   USBSER000   SUCCESS 
IOCTL_SERIAL_GET_CHARS          USBSER000   SUCCESS 
IOCTL_SERIAL_GET_HANDFLOW       USBSER000   SUCCESS 
IOCTL_SERIAL_GET_BAUD_RATE      USBSER000   SUCCESS 
IOCTL_SERIAL_GET_LINE_CONTROL   USBSER000   SUCCESS 
IOCTL_SERIAL_GET_CHARS          USBSER000   SUCCESS 
IOCTL_SERIAL_GET_HANDFLOW       USBSER000   SUCCESS 
IOCTL_SERIAL_SET_BAUD_RATE      USBSER000   SUCCESS Rate: 9600
IOCTL_SERIAL_CLR_RTS            USBSER000   SUCCESS 
IOCTL_SERIAL_CLR_DTR            USBSER000   * 0xC0000001    
IOCTL_SERIAL_SET_LINE_CONTROL   USBSER000   SUCCESS StopBits: 1 Parity: NONE WordLength: 8
IOCTL_SERIAL_SET_CHAR           USBSER000   SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13
IOCTL_SERIAL_SET_HANDFLOW       USBSER000   SUCCESS Shake:0 Replace:0 XonLimit:4096 XoffLimit:4096
IOCTL_SERIAL_GET_BAUD_RATE      USBSER000   SUCCESS 
IOCTL_SERIAL_GET_LINE_CONTROL   USBSER000   SUCCESS 
IOCTL_SERIAL_GET_CHARS          USBSER000   SUCCESS 
IOCTL_SERIAL_GET_HANDFLOW       USBSER000   SUCCESS 
IOCTL_SERIAL_SET_BAUD_RATE      USBSER000   SUCCESS Rate: 9600
IOCTL_SERIAL_CLR_RTS            USBSER000   SUCCESS 
IOCTL_SERIAL_CLR_DTR            USBSER000   * 0xC0000001    
IOCTL_SERIAL_SET_LINE_CONTROL   USBSER000   SUCCESS StopBits: 1 Parity: NONE WordLength: 8
IOCTL_SERIAL_SET_CHAR           USBSER000   SUCCESS EOF:1a ERR:0 BRK:0 EVT:1a XON:11 XOFF:13
IOCTL_SERIAL_SET_HANDFLOW       USBSER000   SUCCESS Shake:0 Replace:0 XonLimit:4096 XoffLimit:4096
IOCTL_SERIAL_CLR_DTR            USBSER000   * 0xC0000001    
IRP_MJ_CLEANUP                  USBSER000   SUCCESS 
IRP_MJ_CLOSE                    USBSER000   SUCCESS 
Foi útil?

Solução

Em relação às diferenças entre hiperterminal e o objecto porta serial NET, Hiperterminal é uma aplicação comercial, estável. Se o objeto de porta serial subjacente morreram ou emitiu uma exceção, Hyperterminal escondeu isso de você. O objeto porta serial NET lança mais exceções do que qualquer outro objeto .NET que já usei.

Pontos de fazer:

  • Sempre que você alterar uma definição, fechá-lo primeiro, alterá-lo, em seguida, re-abri-lo. Algumas portas realmente odeio quando você alterá-la quando está aberto.
  • Esperar para fazer um monte de 'try-catch é em torno de seu objeto porta serial, em torno de cada coisa que você faz.
  • Certifique-se de que você tem um para cada possível exceção listada, e certificar-se de cada um verifica a mensagem (que pode ser diferente em circunstâncias diferentes). Muitos são reembolsáveis ??simplesmente fechar e reabrir.
  • Tente seguir exatamente onde as exceções estão sendo jogados. Veja se modificar a ordem que você definir as coisas fixes que ... o objeto é realmente exigente.

Se você já tentou explicitamente definir DTR para false antes da abertura, em seguida, você pode apenas ter a sorrir e deu à luz com esse dispositivo. O objeto SerialPort não é um dos exemplos brilhantes de uma biblioteca bem implementado em .NET. Se você notar, hyperterminal recebe esse mesmo erro, mas ele simplesmente ignora-lo.

Se você puder, tente-lo com uma porta serial regular ou um dispositivo marca usb diferente. Se você ainda obter o mesmo erro, que poderia ser algo do seu lado aplicativo.

Outras dicas

Em UART real, DTREnable fará valer o pino DTR do seu UART para indicar que você está pronto para receber dados.

Dependendo implementação de motorista, você pode precisar configurar DTREnable para true para abrir a porta.

Veja este fórum pós . Eu suspeito que isso tem a ver com o hardware ou o mau funcionamento do driver. Isso não explica por que ela funciona com Hyperterminal embora. Siga os conselhos de Joseph M. Iniciante para ver o que Hyperterminal está fazendo de forma diferente.

parece que a diferença é o aperto de mão.

Eu não tive problemas com a classe serialport e ter escrito aplicativos que correu para 800.000 bps.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top