Ну наконец-то решена проблема с автоматизацией сборки, с трассировкой и можно перейти непосредственно к работе с 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 порт по умолчанию вообще не нестроен. Изучаем настройки , устанавливаем в драйвере им значения по умолчанию.