青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 45,  comments - 232,  trackbacks - 0

   源代碼請從這里下載:http://m.shnenglu.com/Files/dyj057/Midapexsoft.IO.SerialPort.rar,請使用VS2005打開.
       我寫的CAsyncSerialPort類是一個MFC的類,怎么才能使它在托管代碼中使用呢?方法有兩個:

l         把類的功能封裝成DLL中的API,然后通過平臺調(diào)用實現(xiàn)。這個方法我以前寫過,就不說了,適合在.NET 1.0 1.1中使用。

l         使用C++/CLICAsyncSerialPort轉(zhuǎn)換成一個托管類,然后供C#等代碼使用,這個方法適合在.NET 2.0中使用,下面介紹這個方法。

下面寫出步驟:

第一步:在VS2005中,使用C#創(chuàng)建一個包含串口通訊的接口,生成DLL組件。

第二步:創(chuàng)建一個C++/CLI的組件工程,一定要生成DLL的工程,不能是exe然后引入上面創(chuàng)建的接口DLL,實現(xiàn)一個SerialPortX類。

通過上面的方法,就把基于MFCCAsyncSerialPort轉(zhuǎn)化成了實現(xiàn)了ISerialPort接口的托管類SerialPortX。這個對于許多以前C++寫的代碼轉(zhuǎn)到.NET 2.0中使用,都有借鑒意義。我還使用這個方法,把一個OPC ServerMFC實現(xiàn),轉(zhuǎn)換到了.NET 2.0,很好用的。^:^

最后,我使用SerialPortXVS2005中寫了一個串口通訊工具。

界面效果如下:

關(guān)鍵代碼如下:

using System;

using System.IO.Ports;

 

namespace Midapexsoft.IO.Ports

{

       /// <summary>

       /// Interface of serial port

       /// </summary>

    public interface ISerialPort : IDisposable, Midapexsoft.IO.ITerminal

       {

              #region Property

 

        string PortName

              {

                     get;

                     set;

              }

 

              Parity Parity

              {

                     get;

                     set;

        }

 

        int DataBits

              {

                     get;

                     set;

              }

 

              StopBits StopBits

              {

                     get;

                     set;

              }

 

              StandardBaudRate BaudRate

              {

                     get;

                     set;

              }

 

              Handshake HandShake

              {

                     get;

                     set;

              }

 

              #endregion

       }

 

 

    /// <summary>

    /// Standard baud rate setting

    /// </summary>

    public enum StandardBaudRate

    {

        R110 = 110,

        R300 = 300,

        R600 = 600,

        R1200 = 1200,

        R2400 = 2400,

        R4800 = 4800,

        R9600 = 9600,

        R14400 = 14400,

        R19200 = 19200,

        R38400 = 38400,

        R57600 = 57600,

        R76800 = 76800,

        R115200 = 115200

    };

}

 

//SerialPortX.h

#pragma once

#include "AsyncSerialPort.h"

#include "RuntimeException.h"

#include "SerialPortX.h"

#include "RuntimeException.h"

 

using namespace System;

using namespace System::Collections;

 

class CSerialPortObserver;

 

namespace Midapexsoft

{

namespace IO

{

namespace Port

{

       public ref class SerialPortX: public IStartable, public ISerialPort

       {

       public:

              SerialPortX(void);

              ~SerialPortX(void);

 

              virtual void Stop();

             

              virtual void SerialPortX::Start();

 

              virtual void Write(array<byte> ^ data);

 

              virtual event BytesEventHandler^ OnWriteData

              {

                     void add(BytesEventHandler^ value)

                     {

                            writeDataHandler += value;

                     }

                     void remove(BytesEventHandler^ value)

                     {

                            writeDataHandler -= value;

                     }

                     void raise(Object^ sender, BytesEventArgs^ args)

                     {

                            if(writeDataHandler!=nullptr)

                            {

                                   //writeDataHandler->BeginInvoke(sender, args,nullptr,nullptr);

                                   writeDataHandler(sender,args);

                            }

                     }

              }

 

              virtual event BytesEventHandler^ OnReadData

              {

                     void add(BytesEventHandler^ value)

                     {

                            readDataHandler += value;

                     }

                     void remove(BytesEventHandler^ value)

                     {

                            readDataHandler -= value;

                     }

                     void raise(Object^ sender, BytesEventArgs^ args)

                     {

                            if(readDataHandler!=nullptr)

                            {

                                   //readDataHandler->BeginInvoke(sender, args,nullptr,nullptr);

                                   readDataHandler(sender,args);

                            }

                     }

              }

 

              virtual event MessageEventHandler^ OnError

              {

                     void add(MessageEventHandler^ value)

                     {

                            errorHandler += value;

                     }

                     void remove(MessageEventHandler^ value)

                     {

                            errorHandler -= value;

                     }

                     void raise(Object^ sender, MessageEventArgs^ args)

                     {

                            if(errorHandler!=nullptr)

                            {

                                   //errorHandler->BeginInvoke(sender, args,nullptr,nullptr);

                                   errorHandler(sender,args);

                            }

                     }

              }

 

              property String^ PortName

              {

                     virtual String^ get() { return name;}

                     virtual void set(String^ newName)

                     {

                            //Get port number

                            int portNumberIndex = newName->IndexOf("COM");

 

                            if(portNumberIndex!=0)

                            {

                                   throw gcnew Exception("Bad Port Name");

                            }

 

                            String^ portNumberS = newName->Substring(3);

                            portNumber = Convert::ToByte(portNumberS);

                            name= newName;

 

                     }

              }

 

              property Parity PortParity

              {

                     virtual Parity get() { return parity;}

                     virtual void set(Parity parity)

                     {

                            try

                            {

                                   if(IsOpen)

                                   {

 

                                          Hashtable^ parityTable = gcnew Hashtable();

                                          parityTable->Add(L"None", 2);

                                          parityTable->Add(L"Odd",3);

                                          parityTable->Add(L"Even",gcnew int(0) );

                                          parityTable->Add(L"Mark",1);

                                          parityTable->Add(L"Space",4);

 

                                          int parityMothord = (int) parityTable[parity.ToString()];

 

                                          port->SetParity((CSerialPort::Parity)parityMothord);

                                   }

 

                                   this->parity = parity;

                            }

                            catch (CRuntimeException* e)

                            {

                                   String^ info = gcnew String((LPCTSTR)e->GetErrorMessage());

                                   throw gcnew Exception( info );

                                   e->Delete();

                            }

                           

                     }

              }

 

              property byte DataBytes

              {

                     virtual byte get() { return dataBytes;}

                     virtual void set(byte dataBytes)

                     {

                            if(IsOpen)

                            {

                                   port->SetDataBytes(dataBytes);

                            }

 

                            this->dataBytes = dataBytes;

                     }

              }

 

              property bool IsOpen

              {

                     virtual bool get() { return port->IsOpen() != 0;}

              }

 

              property StopBits PortStopBits

              {

                     virtual StopBits get() { return stopBits; }

                     virtual void set(StopBits stopBits)

                     {

                            try

                            {

                                   if(IsOpen)

                                   {

                                          port->SetStopBits((CSerialPort::StopBits)(int)stopBits);                                              

                                   }

 

                                   this->stopBits = stopBits;

                            }

                            catch (CRuntimeException* e)

                            {

                                   String^ info = gcnew String((LPCTSTR)e->GetErrorMessage());

                                   throw gcnew Exception( info );

                                   e->Delete();

                            }

                           

                     }

              }

 

              property StandardBaudRate BaudRate

              {

                     virtual StandardBaudRate get() { return this->baudRate; }

                     virtual void set(StandardBaudRate newBaudRate)

                     {

                            try

                            {

                                   if(IsOpen)

                                   {

                                          int baud = (int)newBaudRate;

                                          port->SetBaud(baud);

                                   }

 

                                   this->baudRate = newBaudRate;

                            }

                            catch (CRuntimeException* e)

                            {

                                   String^ info = gcnew String((LPCTSTR)e->GetErrorMessage());

                                   throw gcnew Exception( info );

                                   e->Delete();

                            }

                     }

              }

 

              property Handshake PortHandShake

              {

                     virtual Handshake get() { return this->handshake;}

                     virtual void set( Handshake newHandShake)

                     {

                            try

                            {

                                   if(IsOpen)

                                   {

                                          Hashtable ^ handshakeTable = gcnew Hashtable();

                                          handshakeTable->Add("None",gcnew int(0));

                                          handshakeTable->Add("XonXoff",5);

                                          handshakeTable->Add("CtsRts",1);

                                          handshakeTable->Add("DsrDtr",4);

 

                                          //Handshake

                                          int handshake = (int)handshakeTable[ newHandShake.ToString() ];

                                          port->SetFlowControl((CSerialPort::FlowControl)handshake);

 

                                   }

                                   this->handshake = newHandShake;

                            }

                            catch (CRuntimeException* e)

                            {

                                   String^ info = gcnew String((LPCTSTR)e->GetErrorMessage());

                                   throw gcnew Exception( info );

                                   e->Delete();

                            }

                     }

              }

              property bool CanStart

              {

                     virtual bool get() { return canStart;}

                     virtual void set(bool canStart) { this->canStart = canStart; }

              }

 

              property bool IsRun

              {

                     virtual bool get() { return isRun;}

              }

 

              virtual event EventHandler<StartableArgs^>^ OnStartableStatueChange

              {

                     void add(EventHandler<StartableArgs^>^ value)

                     {

                            statusChangeHandler+= value;

                     }

                     void remove(EventHandler<StartableArgs^>^ value)

                     {

                            statusChangeHandler -= value;

                     }

                     void raise(Object^ sender, StartableArgs^ args)

                     {

                            if(statusChangeHandler!=nullptr)

                            {

                                   statusChangeHandler->BeginInvoke(sender,args,nullptr,nullptr);

                            }

                     }

              }

 

       internal:

 

              void OnPortWriteData(array<Byte>^ data)

              {

                     OnWriteData(this, gcnew BytesEventArgs(data));

              }

              void OnPortReceiveData(array<Byte>^ data)

              {

                     OnReadData(this, gcnew BytesEventArgs(data));

              }

 

              void ReportError(String^ errorMessage)

              {

                     OnError(this, gcnew MessageEventArgs(errorMessage));

              }

 

              void SetRunStatus(bool isRun)

              {

                     this->isRun = isRun;

                     OnStartableStatueChange(this, gcnew StartableArgs(this));

              }

 

       private:

              CAsyncSerialPort* port;

              CSerialPortObserver* observer;

 

       private:

              String^ name;

              Parity parity;

              byte dataBytes;

              StandardBaudRate baudRate;

              Handshake handshake;

              StopBits stopBits;

              byte portNumber;

              bool canStart;

              bool isRun;

 

              BytesEventHandler^ writeDataHandler;

              BytesEventHandler^ readDataHandler;

              MessageEventHandler^ errorHandler;

 

               EventHandler<StartableArgs^>^ statusChangeHandler;

 

       };

}

 

}

}

 

posted on 2007-08-24 09:28 天下無雙 閱讀(2278) 評論(1)  編輯 收藏 引用 所屬分類: C/C++

FeedBack:
# re: 串口編程(2)--在托管代碼中使用異步串口類(使用C++/CLI實現(xiàn)轉(zhuǎn)換)
2007-08-30 17:54 | C++面試題
文章好長,看的好累。呵呵  回復(fù)  更多評論
  

常用鏈接

留言簿(15)

隨筆分類

隨筆檔案

相冊

我的其它領(lǐng)域Blog

搜索

  •  

積分與排名

  • 積分 - 207792
  • 排名 - 130

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美午夜精品电影| 亚洲视频香蕉人妖| 亚洲摸下面视频| 亚洲美女区一区| 日韩一级网站| 亚洲女女女同性video| 中国成人黄色视屏| 亚洲一级网站| 欧美一区2区三区4区公司二百| 欧美亚洲三级| 久久综合九色综合久99| 欧美激情一区二区三区在线视频观看| 亚洲成色最大综合在线| 你懂的网址国产 欧美| 亚洲激情第一区| 日韩亚洲综合在线| 午夜免费在线观看精品视频| 欧美影院在线| 欧美日韩免费一区二区三区| 国产精品国产三级国产| 国产片一区二区| 亚洲激情欧美| 久久精品国产成人| 欧美日韩和欧美的一区二区| 毛片一区二区| 欧美国产一区二区在线观看| 亚洲人成网站色ww在线| 亚洲少妇最新在线视频| 久久久久久999| 欧美日韩国产限制| 国产午夜精品一区二区三区欧美| 亚洲高清久久| 午夜日本精品| 欧美激情一区二区三区成人| 亚洲综合国产| 欧美日韩一区二区三区四区在线观看| 国产麻豆日韩欧美久久| 日韩网站免费观看| 模特精品在线| 久久国产一区| 国产精品天美传媒入口| 亚洲激情婷婷| 久久九九热re6这里有精品 | 亚洲在线观看视频| 欧美激情二区三区| 午夜天堂精品久久久久 | 国产视频一区在线| 一本色道久久精品| 亚洲国产一区二区视频| 欧美中文字幕精品| 国产欧美日韩视频一区二区| 久久精品中文字幕一区| 欧美精品国产精品日韩精品| 在线观看久久av| 久久亚洲精品中文字幕冲田杏梨| 亚洲愉拍自拍另类高清精品| 欧美日韩视频免费播放| 亚洲精品视频在线看| 亚洲福利电影| 欧美成人在线免费观看| 亚洲高清一区二| 亚洲电影第1页| 美女福利精品视频| 亚洲人成网站在线观看播放| 欧美好骚综合网| 欧美极品aⅴ影院| 9l国产精品久久久久麻豆| 亚洲成人资源| 欧美日韩一区二区在线视频| 亚洲婷婷国产精品电影人久久| 亚洲人成网站在线观看播放| 欧美精品一区二区三| 亚洲视频一区| 亚洲欧美日韩国产另类专区| 国产亚洲欧美一级| 久久夜色精品国产噜噜av| 久久久国际精品| 亚洲精品美女久久久久| 亚洲国产乱码最新视频| 欧美精品在线观看91| 在线综合亚洲| 国产精品亚洲综合天堂夜夜| 亚洲深夜av| 亚洲午夜av在线| 国产一区二区无遮挡| 欧美成人亚洲成人日韩成人| 欧美片在线观看| 欧美一区二区三区在| 久久青青草综合| 亚洲一区二区三区精品动漫| 欧美一区二区三区免费视频 | 亚洲免费精品| 亚洲视频导航| 激情视频一区二区| 日韩视频在线一区二区三区| 国产视频久久久久久久| 欧美激情麻豆| 国产日韩在线一区二区三区| 亚洲第一色在线| 国产美女精品| 亚洲人成在线播放| 国产日韩精品一区二区| 亚洲第一天堂av| 国产日韩亚洲欧美| 亚洲精品一区在线| 经典三级久久| 亚洲伊人伊色伊影伊综合网 | 国产精品毛片a∨一区二区三区|国| 国产欧美一区二区精品仙草咪| 欧美1区视频| 国产欧美日韩在线播放| 亚洲日产国产精品| 一区二区三区在线免费观看| 亚洲一本视频| 日韩亚洲不卡在线| 久久久久久9999| 欧美专区18| 国产精品入口日韩视频大尺度| 欧美激情第9页| 黄色成人免费观看| 香蕉成人久久| 欧美伊人久久大香线蕉综合69| 免费毛片一区二区三区久久久| 久久国产乱子精品免费女 | 亚洲国产精品一区二区www| 亚洲一区二区在线免费观看视频| 亚洲精品永久免费精品| 久久久久久国产精品mv| 久久精品国产一区二区电影| 欧美日韩中字| 一片黄亚洲嫩模| 亚洲天堂av电影| 欧美日韩dvd在线观看| 欧美激情成人在线| 激情五月婷婷综合| 久久久久国产一区二区| 久久久www成人免费毛片麻豆| 国产精品亚洲视频| 亚洲欧美日韩视频一区| 亚洲女人天堂av| 国产麻豆综合| 久久精品视频播放| 91久久精品国产91久久性色| 午夜国产精品视频免费体验区| 欧美日韩不卡视频| 亚洲激情啪啪| 制服诱惑一区二区| 国产精品老牛| 欧美一区国产一区| 免费在线成人| 亚洲精品视频免费观看| 欧美日本中文| 亚洲视频第一页| 久久精品伊人| 亚洲精品视频中文字幕| 欧美日韩成人一区二区| 一区二区三区四区精品| 亚洲欧美三级伦理| 国产亚洲激情在线| 久久综合九色| 99这里只有久久精品视频| 在线亚洲自拍| 国产亚洲综合精品| 免费久久久一本精品久久区| 亚洲伦理在线观看| 久久国产精品亚洲77777| 亚洲国产国产亚洲一二三| 欧美日本国产| 午夜精彩视频在线观看不卡| 久久久久综合一区二区三区| 亚洲精品欧洲| 国产精品资源| 欧美高清视频一区二区| 亚洲自拍偷拍一区| 欧美777四色影视在线| 亚洲天堂av在线免费| 国产亚洲一区在线播放| 欧美日韩在线一区二区三区| 久久高清福利视频| 日韩一区二区免费看| 玖玖国产精品视频| 亚洲欧美成aⅴ人在线观看| 国语自产偷拍精品视频偷| 欧美精品一区二区久久婷婷| 欧美呦呦网站| 亚洲一区二区在线免费观看视频| 欧美激情国产日韩精品一区18| 欧美一区二区三区免费视| 亚洲伦理在线观看| 国内揄拍国内精品久久 | 国产一区导航| 欧美精品激情blacked18| 篠田优中文在线播放第一区| 亚洲精品一二三区| 欧美成人按摩| 久久久久久国产精品mv| 亚洲综合三区| 亚洲视频在线播放| 一本久道久久综合婷婷鲸鱼| 亚洲精华国产欧美|