COM порт

Ну наконец-то решена проблема с автоматизацией сборки, с трассировкой и можно перейти непосредственно к работе с Com портом (пример VirtualSerial).

Ну сразу выясняем вопрос почему при установки связи с COM портом виснет Termial 1.9 ?
Трассировка через функцию Trace() показывает примерно такой лог :


EventTrace[1]182C.0964::05/14/2018-15:27:05.038 [virtualserial]ERROR: **************** ququ !!!!!! ******************* (c8ecc087-6b79-4de5-8fb4-c03358a29617)
[1]182C.0964::05/14/2018-15:27:05.038 [virtualserial]INFO ....CMyDriver::CreateInstance!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.038 [virtualserial]INFO ....CMyDriver::Initialize!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.038 [virtualserial]INFO ....CMyDriver::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.039 [virtualserial]INFO ....CMyDriver::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.043 [virtualserial]INFO ....CMyDriver::OnDeviceAdd!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.043 [virtualserial]INFO ....CMyDevice::CreateInstance!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.043 [virtualserial]INFO ....CMyDevice::Initialize!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.043 [virtualserial]INFO ....CMyDevice::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.045 [virtualserial]INFO ....CMyDevice::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.045 [virtualserial]INFO ....CMyDevice::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.045 [virtualserial]INFO ....CMyDevice::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.045 [virtualserial]INFO ....CMyDevice::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.045 [virtualserial]INFO ....CMyDevice::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.048 [virtualserial]INFO ....CMyDevice::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.048 [virtualserial]INFO ....CMyDevice::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.048 [virtualserial]INFO ....CMyDevice::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.048 [virtualserial]INFO ....CMyDevice::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.048 [virtualserial]INFO ....CMyDevice::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.048 [virtualserial]INFO ....CMyDevice::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.048 [virtualserial]INFO ....CMyDevice::QueryInterface!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.065 [virtualserial]INFO ....CMyDevice::Configure!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[1]182C.0964::05/14/2018-15:27:05.068 [virtualserial]INFO ....CMyDevice::GetPdoName!.... (2c7089aa-2e0e-11d1-b114-00c04fc2aae4)
[2]182C.0964::05/14/2018-15:27:05.068 [virtualserial]INFO        CMyQueue::CreateInstance
[2]182C.0964::05/14/2018-15:27:05.068 [virtualserial]INFO    CRingBuffer::CRingBuffer
[2]182C.0964::05/14/2018-15:27:05.068 [virtualserial]INFO        CMyQueue::Initialize
[2]182C.0964::05/14/2018-15:27:05.068 [virtualserial]INFO    CRingBuffer::Initialize
[2]182C.0964::05/14/2018-15:27:05.068 [virtualserial]INFO    CRingBuffer::Initialize SUCCEEDED
[2]182C.0964::05/14/2018-15:27:05.068 [virtualserial]INFO        CMyQueue::QueryInterface
[1]182C.0964::05/14/2018-15:27:05.070 [virtualserial]INFO        CMyQueue::QueryInterface
[1]182C.0964::05/14/2018-15:27:05.070 [virtualserial]INFO        CMyQueue::QueryInterface
[1]182C.0964::05/14/2018-15:27:05.070 [virtualserial]INFO        CMyQueue::QueryInterface
[1]182C.0964::05/14/2018-15:27:05.070 [virtualserial]INFO        CMyQueue::QueryInterface
[1]182C.0964::05/14/2018-15:27:05.070 [virtualserial]INFO        CMyQueue::QueryInterface
[1]182C.0964::05/14/2018-15:27:05.070 [virtualserial]INFO        CMyQueue::QueryInterface
[1]182C.0964::05/14/2018-15:27:05.070 [virtualserial]INFO        CMyQueue::QueryInterface
[1]182C.0964::05/14/2018-15:27:05.070 [virtualserial]INFO        CMyQueue::QueryInterface
[1]182C.0964::05/14/2018-15:27:05.070 [virtualserial]INFO        CMyQueue::QueryInterface
[1]182C.0964::05/14/2018-15:27:05.070 [virtualserial]INFO        CMyQueue::QueryInterface
[2]182C.19A8::05/14/2018-15:27:17.820 [virtualserial]INFO        CMyQueue::OnDeviceIoControl IOCTL_SERIAL_GET_BAUD_RATE
[2]182C.15D4::05/14/2018-15:27:17.859 [virtualserial]INFO        CMyQueue::OnDeviceIoControl IOCTL_SERIAL_GET_LINE_CONTROL
[2]182C.19A8::05/14/2018-15:28:20.414 [virtualserial]INFO        CMyQueue::OnDeviceIoControl IOCTL_SERIAL_GET_BAUD_RATE
[2]182C.15D4::05/14/2018-15:28:20.454 [virtualserial]INFO        CMyQueue::OnDeviceIoControl IOCTL_SERIAL_GET_LINE_CONTROL
[2]182C.19A8::05/14/2018-16:25:50.775 [virtualserial]INFO        CMyQueue::OnDeviceIoControl IOCTL_SERIAL_GET_BAUD_RATE
[0]182C.15D4::05/14/2018-16:25:50.815 [virtualserial]INFO        CMyQueue::OnDeviceIoControl IOCTL_SERIAL_GET_LINE_CONTROL
[2]182C.19A8::05/14/2018-16:25:50.899 [virtualserial]INFO    CMyQueue::OnDeviceIoControl  IOCTL_SERIAL_SET_BAUD_RATE
[2]182C.15D4::05/14/2018-16:25:50.982 [virtualserial]INFO        CMyQueue::OnDeviceIoControl IOCTL_SERIAL_SET_LINE_CONTROL
[0]182C.19A8::05/14/2018-16:25:51.120 [virtualserial]INFO        CMyQueue::OnDeviceIoControl IOCTL_SERIAL_SET_TIMEOUTS
[0]182C.15D4::05/14/2018-16:25:51.314 [virtualserial]INFO        CMyQueue::OnRead
[0]182C.15D4::05/14/2018-16:25:51.315 [virtualserial]INFO    CRingBuffer::Read

А это скорее всего нормально. Надо разбираться со всеми запросами из Terminal 1.9, который тот посылает в COM порт и надо корректно отвечать из драйвера обратно.

В нашем случае просто забываем от Terminal 1.9 и переходим на создание своих Com порт терминалов , написанных на Qt или на чем либо еще.

Драйвер мы пишем (понятно) в Win DDK7, проверять работу с ним будем в Qt 4.8.1:

Итак на Qt 4.8.1 минимальный код открытия COM порта прекрасно работает:

#include 

#include 
#include 
#include 
#include 

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);


    HANDLE hCOM = CreateFile(L"\\\\.\\COM3",
                             GENERIC_READ | GENERIC_WRITE,
                             0,
                             0,
                             OPEN_EXISTING,
                             FILE_ATTRIBUTE_NORMAL,
                             NULL);

    printf("GetLastError: %d\n",  GetLastError());

    if (hCOM!=INVALID_HANDLE_VALUE)
    {
        std::cout << "COM3 is open OK!" << std::endl;

        CloseHandle(hCOM);
    }
    else
    {
        printf("error: %d\n",  GetLastError());
        std::cout << "Error Open COM3" << std::endl;
    }
    
    return a.exec();
}


На Qt добавляем после открытия порта:

DCB    dcb;
        if (GetCommState(hCOM,&dcb)== 0)
           printf("GetCommState:   ERROR=%d\n",  GetLastError());
        else
            printf("GetCommState: OK\n");


и видим, что драйвер возвращает действительно baudrate =0.

Попутно находим в нашем драйвере такой код


    CMyDevice(
        VOID
        ) :
        m_FxDevice(NULL),
        m_BaudRate(0), // Baud rate - сюда вбиваем например 115200
        m_MCR(0), // Modem control register  -это включение линий управления DTR,  RTS , тут все по нулям можно
        m_FCR(0), // FIFO control register
        m_LCR(0),  // Line control register
        m_ValidDataMask(0), // Valid data mask
        m_CreatedLegacyHardwareKey(FALSE),
        m_LegacyHardwarePropertyStore(NULL),
        m_PdoName(NULL)
    {
        ZeroMemory(&m_Timeouts, sizeof(SERIAL_TIMEOUTS)); // Timeouts
    }

Комментарии излишне - baudrate =0. (А Может это нормально для VirtualSerial?)
COM открывается без ошибок. Идем дальше? пытаемся передать данные:

В Qt видим (режим отладки) , что наш COM порт вообще не настроен. Все кроме скорости 115200 вообще по нулям. Значит наш COM порт по умолчанию вообще не нестроен. Изучаем настройки , устанавливаем в драйвере им значения по умолчанию.

фотка 1