如何在DLL中设置Using Systems :: IO :: Ports,以便可以从loadlibrary函数调用它

时间:2013-10-04 11:50:18

标签: dll c++-cli

使用vc2012 express c ++

我对运行时库的工作原理有点困惑,但是我需要从一些硬件中为驱动程序创建一个驱动程序,以便可以在SDK中使用它。

我的源代码如下

#include "PhantomAdapter.h"
#include <stdexcept>

int ready()
{
    //return Comms::SerialPort::check();
    return 1;
}
int open()
    {
        int flag=0;

        //flag=Comms::SerialPort::openPort();
        return flag;

    }
int close()
    {
        Comms::SerialPort::closePort();

        return 1;
    }
int angle(double& angle)
    {
        angle = Comms::SerialPort::read();

        return 0;
    }
int torque(double torque)
    {
        Comms::SerialPort::send((Byte)torque);

        return 1;
    }

namespace Comms
{
    //static p1 = gcnew System::IO::Ports::SerialPort();

    int SerialPort::openPort()
    {       
        bool check=0;

        p1 = gcnew System::IO::Ports::SerialPort();

        p1->BaudRate = 57600;
        p1->PortName = "COM3";
        if(p1->IsOpen)
          return 0;
        else {
            p1->Open();
            return 1;
        }

    }

    int SerialPort::check()
    {
        array<String^>^ serialPorts = nullptr;
        bool flag = true;
        serialPorts = p1->GetPortNames();

        for each(String^ port in serialPorts)
        {
            if(port=="COM3")
                flag= true;             
        }

        return flag;
    }

    void SerialPort::closePort()
    {
        p1->Close();
    }

    void SerialPort::send(Byte data)
    {
        array<unsigned char>^ buffer = gcnew array<Byte>(1);

        buffer[0] = (char)data;
        p1->Write(buffer,0,1);  
    }

    double SerialPort::read()
    {
        double data;
        data = p1->ReadByte();
        return data;
    }
}

#define PHANTOMADAPTER_API __declspec(dllexport)
#else
#define PHANTOMADAPTER_API __declspec(dllexport)
#endif

#using <mscorlib.dll>
#using <system.dll>

using namespace System; 
using namespace System::IO::Ports;
using namespace System::Threading;

extern "C" {
PHANTOMADAPTER_API int ready();
PHANTOMADAPTER_API int open();
PHANTOMADAPTER_API int close();
PHANTOMADAPTER_API int angle(double& angle);
PHANTOMADAPTER_API int torque(double torque);
}

namespace Comms
{

    public ref class SerialPort
    {
    private:
        static System::IO::Ports::SerialPort^ p1;

    public:
        static int openPort();
        static void closePort();
        static double read();
        static void send(Byte data);
        static int check();
    };


}

当我调用角度DLL函数或任何需要Comms命名空间的函数时,我收到以下错误。

System.NullReferenceException: Object reference not set to an instance of an object.
    at System.IO.Ports.SerialPort.get_IsOpen()
    at System.IO.Ports.SerialPort.ReadByte()
    at angle(Double* angle)

有人可以指出我正确的方向,我觉得好像无法从运行时库中打开serialPort类,除非我以某种方式导入它

0 个答案:

没有答案