Перейти к содержанию
    

Сигналы квитирования при работе виртуального COM порта. Как послать в сторону компьютера DCD DSR CTS RI. Nuvoton.

Ковыряю работу виртуального порта в проце Nuvoton 487. Не понимаю как управлять сигналами квитирования со стороны процессора. Если в примерах в одном месте была одна корявая закомментированная строчка ,  позволяющая понять как принять от компьютера DTR RTS, то как передать не понятно.

void VCOM_ClassRequest(void)
{
    if (gUsbCmd.bmRequestType & 0x80)   /* request data transfer direction */
    {
        // Device to host
        switch (gUsbCmd.bRequest)
        {
            case GET_LINE_CODE:
                               {
                                 if ((gUsbCmd.wIndex & 0xff) == 0){  /* VCOM-1 */
                                                                   HSUSBD_PrepareCtrlIn((uint8_t *)&gLineCoding, 7);
                                                                   HSUSBD_CLR_CEP_INT_FLAG(HSUSBD_CEPINTSTS_INTKIF_Msk);
                                                                   HSUSBD_ENABLE_CEP_INT(HSUSBD_CEPINTEN_INTKIEN_Msk);
                                                                    break;
                                                                   } /* VCOM-1 */
                                 }
        default:
        {
            /* Setup error, stall the device */
            HSUSBD_SET_CEP_STATE(HSUSBD_CEPCTL_STALLEN_Msk);
            break;
        }
        }
    }//if (gUsbCmd.bmRequestType & 0x80)   /* request data transfer direction */
    
    
    else
    {
        // Host to device
        switch (gUsbCmd.bRequest)
        {
        case SET_CONTROL_LINE_STATE:
        {
            if ((gUsbCmd.wIndex & 0xff) == 0)   /* VCOM-1 */
            {
                gCtrlSignal = gUsbCmd.wValue;
                //  !!!!!!!!!!!!!!!!!!!!!  тут от компьютера
                //printf("RTS=%d  DTR=%d\n", (gCtrlSignal0 >> 1) & 1, gCtrlSignal0 & 1);
            }
            // DATA IN for end of setup
            /* Status stage */
            HSUSBD_CLR_CEP_INT_FLAG(HSUSBD_CEPINTSTS_STSDONEIF_Msk);
            HSUSBD_SET_CEP_STATE(HSUSBD_CEPCTL_NAKCLR);
            HSUSBD_ENABLE_CEP_INT(HSUSBD_CEPINTEN_STSDONEIEN_Msk);
            break;
        }
        case SET_LINE_CODE:
        {
            if ((gUsbCmd.wIndex & 0xff) == 0) /* VCOM-1 */
                HSUSBD_CtrlOut((uint8_t *)&gLineCoding, 7);

            /* Status stage */
            HSUSBD_CLR_CEP_INT_FLAG(HSUSBD_CEPINTSTS_STSDONEIF_Msk);
            HSUSBD_SET_CEP_STATE(HSUSBD_CEPCTL_NAKCLR);
            HSUSBD_ENABLE_CEP_INT(HSUSBD_CEPINTEN_STSDONEIEN_Msk);

            /* UART setting */
            if ((gUsbCmd.wIndex & 0xff) == 0) /* VCOM-1 */
           //  тут меняются настройки порта      VCOM_LineCoding(0);
           // параметры обмена беруться из gLineCoding
            break;
        }
        default:
        {
            /* Setup error, stall the device */
            HSUSBD_SET_CEP_STATE(HSUSBD_CEPCTL_STALLEN_Msk);
            break;
        }
        }
    }
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

image.thumb.png.e08565aa6e4b58a1bdf33b97ddd5857b.png

Устройство отдает состояние этих линий в ответ на запрос SerialState. И если я правильно понимаю, чтобы компьютер послал этот запрос устройство должно послать ему что-то определенное через interrupt endpoint.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про CTS нашел только это:

Цитата

The connection between the adapter and the USB host uses NAK/ACK for flow control.

From Serial Port Complete 2nd Edition:

The model doesn’t define a way for the host to read the state of RS-232’s CTS status signal. Device firmware can still read CTS on a local asynchronous port and take appropriate action. For example, if a virtual COM-port device has data to send to a remote device that hasn’t asserted CTS, the virtual COM-port device can store the data in a  buffer and wait to transmit. If the buffer is full, the virtual COM-port device can NAK attempts by the USB host to send data.

When the remote device asserts CTS, the virtual COM-port device can send the buffered data and begin accepting new data from the host. To use CTS in this way, the USB host doesn’t need to know the signal’s state.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я уже задумался. а может в рамках драйвера порта винды вообще не реализована передача этих сигналов. а pl, ch, ftdi, cp сами под себя в своем драйвере заводят отдельную конечную точку под это.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все может быть. Но я читал, что в десятке драйвер наконец-то сделали вполне рабочим.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 hours ago, firstvald said:

я уже задумался. а может в рамках драйвера порта винды вообще не реализована передача этих сигналов. а pl, ch, ftdi, cp сами под себя в своем драйвере заводят отдельную конечную точку под это.

На чем пишете? В Visual Studio класс Serial.IO поддерживает в том числе и хардварный контроль обмена вот пример на С#: Serial Comms in C# for Beginners - CodeProject 

А это собственно дока: SerialPinChange Перечисление (System.IO.Ports) | Microsoft Learn

Изменено пользователем sayya_78

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...