2012-07-13 5 views
2

Я работаю с внутренним программным инструментом, который отображает & журналы, отформатированные диагностические данные, собранные из последовательного порта отладки продукта, для которого я разрабатываю встроенное программное обеспечение. Он в С и очень старый. Он построен с использованием Borland Turbo-C v1.01 (авторское право 1990!). Если возможно, я предпочел бы изменить, а не переписывать инструмент для современной среды.Как получить доступ к нестандартным COM-портам (USB-> Serial, COM5 +) в DOS/C?

Я хочу собирать данные отладки сразу с нескольких устройств. Я предусмотрел несколько устройств, подключенных через USB-> последовательные адаптеры к концентратору, подключенному к ПК (под управлением Windows XP). Запустите один экземпляр диагностического инструмента на каждое устройство (опять же, в Windows), указав на соответствующий COM-порт. Легко, правда?

Не совсем. Обратите внимание на функцию инициализации последовательного порта Я работаю с:

void serinit(int baudrate, char paristat, char adaptnum) { 
    int hibcon, lobcon, paricon; 
    if(adaptnum == '3') { 
    sioreg = lowbaud = 0x3E8;  // SIO (Serial I/O Reg.) 
    intenreg = highbaud = 0x3E9; // IER (Interrupt Enable Reg.) 
    intidreg = 0x3EA;    // IIR (Interrupt Ident. Reg.) 
    linecon = 0x3EB;    // LCR (Line Control Reg.) 
    modemcon = 0x3EC;    // MCR (Modem Control Reg.) 
    linestat = 0x3ED;    // LSR (Line Status Reg.) 
    modemstat = 0x3EE;   // MSR (Modem Status Reg.) 
    sintvect = 0x0C; 
    sintmask = 0x10; 
    } else if(adaptnum == '2') { 
    //omitted for brevity, similar to above w/ different magic numbers 
    } else { 
    //ditto 
    } 

    outportb(linecon, 0x80);  // LCR - set up to set baud rate 

    switch(baudrate) { 
    case 9600: hibcon = 0x00; lobcon = 0x0C; break; 
    //more magic numbers for other baud rates 
    } 

    outportb(lowbaud, lobcon);   // Baud Rate Divisor LSB 
    outportb(highbaud, hibcon);   // Baud Rate Divisor MSB 

    switch(paristat) { 
    case 'o': //odd parity, 2 stop, 7 data 
    case 'O': paricon = 0x0E; break; 
    //more magic numbers for other parity settings 
    } 

    outportb(linecon, paricon); //Line Control Register 
    outportb(intenreg, 0x01); //IER - receive enabled 
    outportb(modemcon, 0x09); //x x x x +out2 x -rts +dtr 

    imodemcon = 0x09;  //update image 
    inportb(sioreg);  //Just in case there's anything lurking in the register 
    intvsave = getvect(sintvect); 
    setvect(sintvect, serint); //Set up interrupt vector. 
    outportb(0x21, inportb(0x21) & !sintmask); //OCW 1 - enable serial interrupts 
} 

мои варианты О чем для адаптации такого рода конфигурации для COM-портов 5+ как USB-> Серийные адаптеры будут отображаться как? Я могу видеть их, как ожидалось, с помощью команды DOS mode (и в диспетчере устройств Windows, как у обычного человека), но я не уверен, как получить к ним доступ из диагностической программы.

ответ

7

Для прямого обращения к регистрам ввода-вывода требуется драйвер устройства, который эмулирует поведение традиционного COM-порта. Это делает стандартный драйвер устройства Microsoft. Но вы не используете этот драйвер, у вас есть драйвер USB для конкретного поставщика.

Эти драйверы эмулируют последовательный порт, проводя себя в стандартные функции winapi для последовательных портов. Подобно CreateFile(), SetCommConfig() и т. Д. Для этого необходимо записать 32-битный код для использования этих функций. То, что они не делают, это эмулировать регистры, поэтому приложения DOS могут работать, и все кончено. И не может работать вообще, DOS поддерживает только 4 COM-порта, поэтому только 4 набора регистров, где они когда-либо использовались. Нет стандартных адресов регистра для COM5 и выше.

Возможно, вы найдете USB-эмулятор с драйвером, который все еще делает это. Но я считаю, что шансы очень низкие. Вместо этого выходите замуж за свое 90-е программное обеспечение на 90-е оборудование. Купите старую карту PCI, которую вы ввинчиваете в автобус. Так что стандартный драйвер Microsoft работает. Эти карты все еще были доступны в прошлый раз, когда я смотрел (толстый год назад), хотя сборщики становились стройными. Или выкопайте одну из старой машины.

+2

Кроме того, многие USB-последовательные адаптеры не реализуют все линии контроля состояния (или реализуют их должным образом) –

0

Если вы используете чистую DOS, вы будете ограничены COM-портами, доступными в системе. Взгляните на руководство пользователя для расширителя последовательного порта this. Он позволяет вам выбирать COM-порты до 7.

Если вы используете это приложение DOS в Windows, взгляните на ресурсы устройства в диспетчере устройств. Диапазон ввода/вывода, о котором он сообщает, будет диапазоном адресов регистров для вашей программы. Эта веб-страница demonstrates демонстрирует поиск информации.

 Смежные вопросы

  • Нет связанных вопросов^_^