Saltar al contenido

Error de excepción de E/S al usar serialport.open()

Te recomendamos que revises esta resolución en un entorno controlado antes de enviarlo a producción, un saludo.

Solución:

Esto proviene del controlador del puerto serie; no está satisfecho con uno de los ajustes. Dado que la tasa de baudios es un buen candidato, los controladores tienden a permitir solo hasta 115200. Aunque esto no debería ser una restricción cuando se trata de un producto de bus CAN dedicado.

La mejor manera de abordar esto es utilizando la utilidad Portmon de Sysinternals; puede ver lo que se envía al conductor. Obsérvelo para Terminar primero; esa es su línea de base conocida para trabajar. Luego juegue con las propiedades de SerialPort hasta que los comandos de inicialización, como los ve en PortMon, enviados por su programa coincidan con los de Termite. Solo los valores, no el orden. Si eso tampoco funciona, entonces llévelo al estacionamiento y retroceda con su automóvil varias veces y compre otra marca.


Actualización: ciertamente parece un problema de velocidad de transmisión. Ese es un problema en .NET; no va a ignorar el código de retorno de error del controlador como lo hacen sus programas de emulador de terminal. El valor real no debería importar ya que está hablando con un emulado Puerto serial. Sin embargo, existe un posible problema con la velocidad del bus CAN; las tarifas son variables y no me queda claro cómo se negocian. Esto tendía a hacerse con los interruptores DIP en los viejos tiempos, y bien puede ser que el controlador quiera que usted especifique la velocidad a través de la configuración de velocidad en baudios. Debería haber algo al respecto en la caja o en el manual. Las velocidades típicas son 40, 250 o 500 kbit/s. El fabricante ciertamente lo sabría; llámalos.

Me encontré con la misma situación. Estoy tratando de conectar la comunicación serial a mi Dongle USB 3G (Huawei E303F) en /dev/ttyUSB0. Uso Mono en Raspbian (Raspberry Pi 2). En mi PC de desarrollo y macOS, mi programa funciona bien. Pero cuando lo implemento en Raspbian, obtuve el Tubería rota de IOException error en Serial.Open().

Me tomó tres días de depuración y probé todas las soluciones posibles. Finalmente descubrí que tengo que configurar…

serialPort.DtrEnable = true;
serialPort.RtsEnable = true;

Antes de llamar a .Open().

Enfrenté un problema similar al informado en este hilo, ¡pero logré resolver el problema!

¡Estoy usando STM32F2xx para el VCP!

Y de hecho fue mi problema de firmware. ¡Olvidé incluir la configuración del puerto serie en mi devolución de llamada USB!

El proceso de conexión de un puerto serie desde PC y firmware:

  1. Cuando una PC abre una comunicación de puerto serie, la PC enviará algún comando al “punto final de configuración”
  2. En el firmware, tendría una devolución de llamada y el firmware proporcionará toda la información del USB (lo llaman un descriptor de USB)
  3. La información de USB es la configuración de cada punto final (por ejemplo, latencia, tamaño de transmisión de datos y tipo de USB: alta o baja velocidad)
  4. Una vez que el firmware haya completado el envío de toda la información, la PC reconocerá y la comunicación USB se abrirá con éxito
  5. Luego, la PC enviará un comando para obtener la configuración del puerto serie del firmware
  6. La configuración del puerto serie es la velocidad en baudios, la paridad de datos y la longitud de bits.
  7. En el firmware, debe responder la configuración del puerto serie a la PC (mi error ocurre aquí; No envié ninguna configuración de puerto serie a la PC)
  8. ¡Si tiene éxito, la PC iniciará la comunicación del puerto serie!
  9. Si falla, la PC dará un error de puerto serie abierto (pero tenga en cuenta que este error a veces se pasa por alto)

En el código de firmware STM32:

static int8_t CDC_Control_FS (uint8_t cmd, uint8_t* pbuf, uint16_t length)
{
    switch (cmd) {
       case CDC_GET_LINE_CODING:
        
            // I was missing this part
            uint32_t baudrate = 9600;
            pbuf[0] = (uint8_t)(baudrate);
            pbuf[1] = (uint8_t)(baudrate >> 8);
            pbuf[2] = (uint8_t)(baudrate >> 16);
            pbuf[3] = (uint8_t)(baudrate >> 24);
            pbuf[4] = 0;
            pbuf[5] = 0;
            pbuf[6] = 8;
            break;
        :
....

Aquí tienes las reseñas y valoraciones

Nos encantaría que puedieras comunicar este escrito si lograste el éxito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *