2

私は、組み込みソフトウェアを開発している製品のシリアル デバッグ ポートから収集されたフォーマットされた診断データを表示およびログに記録する社内ソフトウェア ツールを使用しています。それはCであり、非常に古いです。Borland Turbo-C v1.01 (copyright 1990!) を使用して構築されています。可能であれば、最新の環境用にツールを書き直すよりも、修正したいと考えています。

一度に複数のデバイスからデバッグ データを収集したい。USB->シリアル アダプタ経由でハブに接続され、PC (Windows XP を実行) に接続された複数のデバイスを想定していました。適切な COM ポートを指定して、デバイス (Windows の場合) ごとに診断ツールのインスタンスを 1 つ実行します。簡単ですよね?

そうではありません。私が取り組んでいるシリアルポートの初期化関数を観察してください:

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
}

USB->シリアルアダプタが表示されるように、COMポート5+にこの種の構成を適応させるためのオプションは何ですか? DOSmodeコマンドを使用すると (通常の人間のように Windows デバイス マネージャーで) 期待どおりにそれらを確認できますが、診断プログラムからそれらにアクセスする方法がわかりません。

4

3 に答える 3

7

I/O レジスタを直接アドレス指定するには、従来の COM ポートの動作をエミュレートするデバイス ドライバが必要です。標準の Microsoft デバイス ドライバーがこれを行います。しかし、あなたはそのドライバーを使用していません。ベンダー固有の USB ドライバーがあります。

これらのドライバーは、シリアル ポートの標準の winapi 関数に接続することで、シリアル ポートをエミュレートします。CreateFile()、SetCommConfig() などのように。これらの関数を使用するには、32 ビット コードを記述する必要があります。彼らがしていないのは、レジスタをエミュレートして、DOS アプリがまだ動作できるようにすることです。DOS は 4 つの COM ポートしかサポートしていなかったので、使用されたレジスタは 4 セットしかありませんでした。COM5 以上の標準レジスタ アドレスはありません。

おそらく、これを行うドライバーを備えた USB エミュレーターを見つけることができます。しかし、その可能性は非常に低いと思います。代わりに、90 年代のソフトウェアと 90 年代のハードウェアを組み合わせてください。バスにねじ込む昔ながらの PCI カードを購入します。標準の Microsoft ドライバーが動作するようにします。それらのカードは、私が最後に見たとき (1 年前に太った) はまだ入手可能でしたが、ピッキングは少なくなりました。または、古いマシンから 1 つを掘り出します。

于 2012-07-13T16:45:48.843 に答える
0

純粋な DOS を実行している場合は、システムで使用できる COM ポートに制限されます。このシリアル ポート エクスパンダのユーザー マニュアルをご覧ください。最大 7 つの COM ポートを選択できます。

Windows 内でこの DOS アプリケーションを実行している場合は、デバイス マネージャーでデバイスのリソースを確認してください。それが示すI / O範囲は、プログラムのレジスタアドレス範囲になります。この Web ページでは、情報を見つける方法を示します

于 2012-07-13T16:22:44.383 に答える