serialpy.py:
from ctypes import cdll
lib = cdll.LoadLibrary('./serialcpp.so')
class SerialPy(object):
def __init__(self):
self.obj = lib.SerialCPP_New()
def startComm(self):
lib.SerialCPP_startComm(self.obj)
serialObj = SerialPy()
serialObj.startComm()
serialcpp.cpp:
#include <windows.h>
#include <string>
class SerialCPP {
public:
HANDLE serialHandle;
public:
void startComm() {
COMMTIMEOUTS timeout = { 0 };
DCB serialParams = { 0 };
int returnStatus;
// Start connection to the port
serialHandle = CreateFileA((LPCSTR) "\\\\.\\COM3", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
}
};
extern "C" {
SerialCPP* SerialCPP_New(){ return new SerialCPP(); }
void SerialCPP_startComm(SerialCPP* SerialCPPObj) { SerialCPPObj->startComm(); }
}
这是我如何将.cpp文件编译成.so文件的
>g++ -c -fPIC serialcpp.cpp -o serialcpp.o
>g++ -shared -o serialcpp.so serialcpp.o
在生成.so文件后运行python文件时,出现以下错误:
PS C:\Users\Luke\Documents\GitHub\---------\src\main> & C:/ProgramData/Anaconda3/python.exe c:/Users/Luke/Documents/GitHub/---------/src/main/serialpy.py
Traceback (most recent call last):
File "c:/Users/Luke/Documents/GitHub/---------/src/main/serialpy.py", line 12, in <module>
serialObj.startComm()
File "c:/Users/Luke/Documents/GitHub/---------/src/main/serialpy.py", line 9, in startComm
lib.SerialCPP_startComm(self.obj)
OSError: exception: access violation writing 0x00000000B77919B0
我正在使用python 3.8.8
当我用注释掉的CreateFileA行运行这段代码时,它工作得很好,但我不确定是什么导致了这个错误。我最好的猜测是,它与字符串“\\.\COM3”被写入内存有关,python程序也没有访问权限
编辑: 当我删除
HANDLE serialHandle;
改变
serialHandle =
到
HANDLE serialHandle =
它开始工作了。我真的需要这个变量是全局的,因为我在startComm之外的其他方法中访问它,所以我的问题没有得到解决
编辑2: 原来我初始化全局变量时出错了。我不得不把我的变量放在课堂之外,不知道为什么
目前没有回答
相关问题 更多 >
编程相关推荐