【WinIO】說明與使用


WinIO http://www.internals.com/

【目的】

  1. 在 WinXP底下直接控制 IO Port ,如 LPT Port。

【安裝】

WinIO第三版下載之後解開,會看到下面幾個檔案,摘錄一下要注意的

  • Binaries
    • WinIo32.dll/WinIo32.sys 要和執行檔放在同一路徑
    • WinIo64.dll/WinIo64.sys 要和執行檔放在同一路徑
    • DumpPhys.exe/DumpPort.exe 作者用C#寫的範例
  • Source
    • Dll/winio.h 給SourceCode include 用的 ,要和程式放在同一路徑
    • Drv/winio_nt.h 給SourceCode include 用的 ,要和程式放在同一路徑
  • Help
    • WinIo.chm 說明文件
  • Samples
    • DumpPhys/DumpPort 作者用C#寫的範例的原始碼

【使用】

  1. 第一步先確定你要存取的 io port adress,這邊以 LPT 當例子,目前的IO range 就是 03BC - 03BE。
    image
  2. 硬體
    1. 以LPT Port 做輸出。
      image
    2. 線路圖(待補)
      基本上就是 lpt 的 data port 直接接到 LED陰極。
  3. Qt 程式
    1. Include File
      #include "winio.h"
    2. 基本程式: 使用 QLibrary
      (注意: 基本上是可以動的,但在 SetPortVal時會有緩衝區滿溢的問題需解決/研究)
        
      #include <qlibrary>
      typedef bool(*InitializeWinIoFunc)();
      typedef bool(*ShutdownWinIoFunc)();
      typedef bool(*SetPortValFunc)(WORD, DWORD, BYTE);
      
      QLibrary mylib("WinIo32");    
      if(mylib.load()){
        //QMessageBox::information(this,tr("info"),tr("WinIo32 Load OK!"));
        InitializeWinIoFunc InitializeWinIo=(InitializeWinIoFunc)mylib.resolve("InitializeWinIo");
        if (InitializeWinIo) { QMessageBox::information(this,tr("info"),tr("InitializeWinIo!"));}
        bool Result = InitializeWinIo();
        if(!Result) {QMessageBox::information(this,tr("info"),tr("InitializeWinIo fail!"));}
        }
      
      if(mylib.isLoaded()){
        SetPortValFunc SetPortVal=(SetPortValFunc)mylib.resolve("SetPortVal");
        if (SetPortVal) { QMessageBox::information(this,tr("info"),tr("SetPortVal!"));}
        bool Result = SetPortVal(0x3bc,0x00,1);
        if(!Result) {QMessageBox::information(this,tr("info"),tr("SetPortVal fail!"));}
          }
      
      if(mylib.isLoaded()){ 
        ShutdownWinIoFunc ShutdownWinIo=(ShutdownWinIoFunc)mylib.resolve("ShutdownWinIo");
        if (ShutdownWinIo) { QMessageBox::information(this,tr("info"),tr("ShutdownWinIo!"));}
        bool Result = ShutdownWinIo();
        if(!Result) {QMessageBox::information(this,tr("info"),tr("ShutdownWinIo fail!"));}
      }
      if(mylib.isLoaded()){mylib.unload();}
    3. 使用 Win32 API(程式碼還有改善空間,不過基本上動作沒問題)
      typedef bool (CALLBACK* InitializeWinIoFunc)();
      typedef bool (CALLBACK* ShutdownWinIoFunc)();
      typedef bool (CALLBACK* SetPortValFunc)(WORD, DWORD, BYTE);
      
      HINSTANCE hDLL; // Handle to DLL
      InitializeWinIoFunc lpfnInitializeWinIo; // Function pointer
      ShutdownWinIoFunc    lpfnShutdownWinIo;
      SetPortValFunc        lpfnSetPortVal;
      
      bool uReturnVal;
      
      hDLL = LoadLibrary(L"WinIo32.dll");
      if (hDLL != NULL)
      {
        lpfnInitializeWinIo = (InitializeWinIoFunc)GetProcAddress(hDLL,"InitializeWinIo");
        lpfnShutdownWinIo = (ShutdownWinIoFunc)GetProcAddress(hDLL,"ShutdownWinIo");
        lpfnSetPortVal = (SetPortValFunc)GetProcAddress(hDLL,"SetPortVal");
      
        if ((!lpfnInitializeWinIo) || (!lpfnShutdownWinIo) || (!lpfnSetPortVal))
        {
          // handle the error
          FreeLibrary(hDLL);
          QMessageBox::information(this,tr("info"),tr("Load Dll Fail!"));
        }
        else
        {
          // call the function
          uReturnVal = lpfnInitializeWinIo();    
          uReturnVal = lpfnSetPortVal(0x3BC,0x55,1);
          uReturnVal = lpfnShutdownWinIo();
      }
      FreeLibrary(hDLL);
      }

【待補】

  1. MFC程式 (用到再補)

【驗證】

  1. 在驗證你的程式之前,建議先用現成的工具來驗證你的硬體。
    1. 打開 DumpPort.exe,填入 port address/value先驗證你的硬體是否輸出正確的值。
      image
    2. value可以填 00/FF/55/AA 來交互驗證硬體。
  2. 打開先前寫好的程式,基本上就是看 LED 有無輸出所指定的值。

【備註】

  1. LPT 接腳目前用到 Data Port  http://en.wikipedia.org/wiki/LPT
  2. USB接腳目前用到 pin1(Vcc)/pin4(Gnd) 作供給電源的動作 http://zh.wikipedia.org/zh-cn/USB

【其他】

【參考】

【Cutecom】com port accessing


據說是一套用Qt4寫的軟體讀/寫 com port 軟體,也有支援 X/Z/Y modem 傳檔的功能。

【安裝】

$ apt-get install cutecom

【使用】

  1. 選定要使用的 com port,如 /dev/ttyS0
  2. Open device

【問題】

  • 實際使用時會出現亂碼,目前不知如何解決。
    image

【Ghex2】Linux底下的 hex edit


【安裝】

$ apt-get install ghex

【使用】

$ ghex2 filename

【問題】

  • 不知是否能一列只顯示 16 個?
    image

【參考】

【Solid Edge】3D繪圖設計軟體


Solid Edge http://www.solidedge.com/

【參考】

  1. Solid Edge 線上教學區
    http://www.solid-edge.com.tw/

【Qt】QDir


【目的】

  1. 使用 Qdir 列出所在所在目錄下的檔案。
  2. 搭配QTreeWidget列出所在目錄下的檔案。

【基本方式】

  • 程式
    #include <QtGui/QApplication>
    #include <QDir>
    #include <iostream>
    
    int main(int argc, char *argv[])
    {
      QCoreApplication app(argc, argv);
      QDir dir;
      dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
      dir.setSorting(QDir::Size | QDir::Reversed);
    
      QFileInfoList list = dir.entryInfoList();
      std::cout << "     Bytes Filename" << std::endl;
      for (int i = 0; i < list.size(); ++i)
      {
        QFileInfo fileInfo = list.at(i);
        std::cout << qPrintable(QString("%1 %2").arg(fileInfo.size(), 10)
                                                .arg(fileInfo.fileName()));
        std::cout << std::endl;
      }
    return 0;
    }
  • 結果
    image

【搭配QTree】

  • 程式
    #include <QApplication>
    #include <QTreeWidget>
    #include <QTreeWidgetItem>
    #include <QStringList>
    #include <QFile>
    #include <QFileInfo>
    #include <QDir>
    
    int main(int argc, char *argv[])
    {
      QApplication app(argc, argv);
    
      QTreeWidget *treeWidget = new QTreeWidget;
      treeWidget->setWindowTitle("QTreeWidget & Item");
      treeWidget->resize(400, 250);
      QStringList columnTitle;
      columnTitle.append("Name");
      treeWidget->setHeaderLabels(columnTitle);
      QFileInfo fileInfo(QCoreApplication::applicationDirPath());
      QStringList fileColumn;
      fileColumn.append(fileInfo.fileName());
      QTreeWidgetItem *dir = new QTreeWidgetItem(fileColumn);
      treeWidget->addTopLevelItem(dir);
      listFile(dir, fileInfo);
      treeWidget->show();
      return app.exec();
    }
    
    void listFile(QTreeWidgetItem *parentWidgetItem, QFileInfo &parent)
    {
      QDir dir;
      dir.setPath(parent.filePath());
      dir.setFilter(QDir::Files | QDir::Dirs | QDir::NoSymLinks);
      dir.setSorting(QDir::DirsFirst | QDir::Name);
      const QFileInfoList fileList = dir.entryInfoList();
      for (int i = 0; i < fileList.size(); i++) 
      {
        QFileInfo fileInfo = fileList.at(i);
        QStringList fileColumn;
        fileColumn.append(fileInfo.fileName());
        if (fileInfo.fileName() == "." || fileInfo.fileName() == ".." );
        else if(fileInfo.isDir()) 
        {
          QTreeWidgetItem *child = new QTreeWidgetItem(fileColumn);
          parentWidgetItem->addChild(child);
          listFile(child, fileInfo);
        }
        else
        {
          QTreeWidgetItem *child = new QTreeWidgetItem(fileColumn);
          parentWidgetItem->addChild(child);
        }
      }
    }
  • 結果

    image

【參考】

 

Ed32. Copyright 2008 All Rights Reserved Revolution Two Church theme by Brian Gardner Converted into Blogger Template by Bloganol dot com