我要调用研华的CAN驱动dll,将CAN卡收到的数据存放在一个全局变量buffer中,buffer为簇数组,簇为CAN帧结构。附图1是我写的程序,图2是调用dll函数时参数的设置。程序运行时能分配内存,但是关闭vi和labview时经常出现错误,甚至死机,错误日志如下:
source\mgcore\MemoryManager.cpp(437) : DAbort:
$Id: //labview/branches/Saturn/dev/source/mgcore/MemoryManager.cpp#16 $
0x012BAC58 - LabVIEW <unknown> + 0
0x012CD0A4 - LabVIEW <unknown> + 0
0x012BAC39 - LabVIEW <unknown> + 0
。。。。
c:\builds\penguin\labview\branches\Saturn\dev\source\typedesc\TD80ReadWrite.cpp(1857) : DWarn: UnFlattenListOfTypes : Loading an insane type descriptor.
$Id: //labview/branches/Saturn/dev/source/typedesc/TD80ReadWrite.cpp#1 $
0x012B00E8 - LabVIEW <unknown> + 0
0x01355B8C - LabVIEW <unknown> + 0
0x01355D4F - LabVIEW <unknown> + 0
0x00F8AC25 - LabVIEW <unknown> + 0
0x00F8BDC1 - LabVIEW <unknown> + 0
我怀疑是内存管理的问题,但一直也没找出问题。
函数原型为:
LRESULT CANSetBufferPtr(
WORD Port,
PVOID FAR pOutputBuffer,
ULONG PackNum,
BOOL FAR *Ready
)
其中 ,pOutputBuffer——Input PVOID FAR default this pointer is set by caller, it points to the buffer that can receive transmit data
研华的例程如下:
CAN_MSG_T * g_pData;
g_pData = ( PCAN_MSG_T )GlobalAlloc( GPTR, 100*sizeof(CAN_MSG_T) ); //CAN_MSG_T为帧结构
if( g_pData == NULL )
{
printf("Out of memory!\n");
CANPortClose(m_nPort);
return 0;
}
// lock the memory
GlobalLock( g_pData );
bReady = FALSE;
CANSetBufferPtr( m_nPort, g_pData, 100, &bReady );// set the receive buffer
各位高人,能不能帮我找找错误?或者告诉我在labview里怎么实现研华的例程?
万分感谢!!!!!!!
别想了,是没办法的,据我所知,lv只支持数字型数组,连单一的字符串型数组都有困难!更别说结构体了,我也刚在这上面研究了很长时间,单一的按址传值,传结构体解决了,但结构体数组没想法了。没有解决,而我换方法了。建议你用c++再包一下,包成labview支持的数据类型。
给你一点我的程序,但愿对你有点用处。
如果我的dll接受一个参数为结构体数组,其格式为:
long uploadResultDataAndRecipe(long sessionId, char* stationNr, long resultDataExtArraySize, struct ResultDataExtendedStruct* resultDataExtArray);
struct ResultDataExtendedStruct
{
long nr;
char* name;
char* value;
char* min;
char* max;
char* nom;
char* toleranz;
char* unit;
long failCode;
char* messtyp;
};
我要怎么处理?请指教!我只知道红色标出来的参数是一个结构数组。怎么用cin结点处理这个数组参数?我想无论怎么处理,这个参数的格式是不能变的,dll要接受的参数是个结构体数组。