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

如何在DLL中使用Systems::IO::Ports进行设置,以便可以从loadlibrary函数调用它,dll,c++-cli,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;

使用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;
    }
}

有人能告诉我正确的方向吗?我觉得serialPort类无法从运行库打开,除非我以某种方式导入它

您已经注释掉了open port方法。您的p1将始终为空。在调用其他函数时,确保p1中有一个有效的对象。这仍然是C++/CLI,请下次记住这一点。您编写了大量代码,但不了解System::IO::Ports::SerialPort类的工作原理。遇到了一个基本问题,实际上还没有创建类的对象。最好扔掉它,它会给你带来更多的麻烦。从谷歌的某个地方开始工作,这样做是对的。谢谢,我想我会听从你的建议,我可以选择Soal::IO::PORT::SerialPoor上的任何教程吗?或者最好在运行时DLL中找到一个与标准应用程序不同的写的程序吗?你正在使用C++,最好使用任何优秀的C++串口库,比如Win32 API本身,而不是Bug混乱,这是代码>系统::IO::端口:SerialPosie<代码>
#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();
    };


}
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)