110,538
社区成员
发帖
与我相关
我的任务
分享
BOOL CDGX::WriteBfm( int nUnit, int addr, int nDevCnt, LPBYTE data )
{
BYTE buf[530];//最大524
LPBYTE p = &buf[4];
int i, n, byt;
while( nDevCnt > 0 )
{
if( m_nUartStopFlag != 0 )
return FALSE;
if( nDevCnt > 127 )
n = 127;
else
n = nDevCnt;
p[0] = 0xf1;
p[1] = ((nUnit<<4)&0xf0) | ((addr>>12)&0xf);
p[2] = (addr>>4)&0xff;
p[3] = (addr<<4)&0xf0;
p = &p[3];
byt = n*2;//字节数
*p++ |= (byt>>4 ) & 0xf;
*p = (byt<<4) & 0xf0;
//数据
for( i=0; i<byt; i++ )
{
int Q = *data++;
*p++ |= (Q>>4 ) & 0xf;
*p = (Q<<4) & 0xf0;
}
for( i = 0; i < MAX_UART_TRY; i++ )
{
SendReq( buf, n*4 + 9 );
if( WriteDevice_Ack() )
break;
if( m_nUartStopFlag != 0 )
return FALSE;
ReShakeHandle(1);
}
if( i == MAX_UART_TRY )
return FALSE;
nDevCnt -= n;
addr += byt;
data += byt;
}
return TRUE;
}
public unsafe bool WriteBfm(int nUnit, int addr, int nDevCnt, byte* data)
{
byte[] buf = new byte[530];
fixed (byte* pbuf = buf)
{
fixed (byte* p = &buf[4])
{
int i, n, byt;
while (nDevCnt > 0)
{
if (m_nUartStopFlag != 0)
return false;
if (nDevCnt > 127)
n = 127;
else
n = nDevCnt;
p[0] = 0xf1;
p[1] = (byte)(((nUnit << 4) & 0xf0) | ((addr >> 12) & 0xf));
p[2] = (byte)((addr >> 4) & 0xff);
p[3] = (byte)((addr << 4) & 0xf0);
p = &p[3];
byt = n * 2;//字节数
*p++ |= (byte)((byt >> 4) & 0xf);
*p = (byte)((byt << 4) & 0xf0);
//数据
for (i = 0; i < byt; i++)
{
int Q = *data++;
*p++ |= (byte)((Q >> 4) & 0xf);
*p = (byte)((Q << 4) & 0xf0);
}
for (i = 0; i < MAX_UART_TRY; i++)
{
SendReq(pbuf, n * 4 + 9);
if (WriteDevice_Ack())
break;
if (m_nUartStopFlag != 0)
return false;
ReShakeHandle(1);
}
if (i == MAX_UART_TRY)
return false;
nDevCnt -= n;
addr += byt;
data += byt;
}
return true;
}
}
}
// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DGX_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// DGX_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#include "define.h"
#include "Serial.h"
#ifdef DGX_EXPORTS
#define DGX_API extern "C" __declspec(dllexport)
#else
#define DGX_API extern "C" __declspec(dllimport)
#endif
// CSerial.h
#ifndef __DGX_FX_PORT_H__
#define __DGX_FX_PORT_H__
#define MAX_UART_TRY 3
/*
#define DEVBUF_D 0X4000 //D0000-D7999
#define DEVBUF_D8 0X8000 //D8000-D8511
#define DEVBUF_M 0X8800 //M0-M7679(1)
#define DEVBUF_Y 0X8BC0 //Y0-Y377(1)
#define DEVBUF_M8 0X8C00
#define DEVBUF_CX 0X8C40 //C0-C255(触点)
#define DEVBUF_TX 0X8C60 //T0-T511(触点)
#define DEVBUF_X 0x8CA0 //X0-X377 256
#define DEVBUF_S 0X8CE0 //8CE0-8EE0 S0-S4095 768
#define BDEV_S 0
#define BDEV_X 1
#define BDEV_Y 2
#define BDEV_TX 3
#define BDEV_M 4
#define BDEV_CX 5
#define BDEV_M8 6
#define BDEV_Db 7
#define BDEV_KnS 8
#define BDEV_KnX 9
#define BDEV_KnY 10
#define BDEV_KnM 12
#define BDEV_KnM8 14
#define WDEV_D 16
#define WDEV_D8 17
#define WDEV_R 18
#define WDEV_TV 19
#define WDEV_CV1 20
#define WDEV_CV2 21
#define WDEV_UG 22
#define WDEV_KH 23
#define DEV_ERR 24
*/
#endif
class CDGX
{
public:
CDGX();
~CDGX();
CSerial *pPort;
int m_nUartStopFlag;
int m_nPort, m_nBaud;
int m_nSend, m_nRecv, m_nError;
BOOL Open(int port, int baud );
public:
BOOL ShakeHandle();
BOOL SetBitDevice( LPSTR strDev, int data );
BOOL SetBitDevice( UINT addr, int data );
BOOL ReadDevice( LPSTR strDev, int nDevCnt, LPBYTE data );
BOOL ReadDevice( UINT addr, int nDevCnt, LPBYTE data );
int ReShakeHandle(int mode = 1);
int ReceData( BYTE *buffer, int limit );
void SendReq( LPBYTE SendBuf, int nSendLength );
BOOL WriteDevice( LPSTR strDev, int nDevCnt, LPBYTE data );
BOOL WriteDevice( UINT addr, int nDevCnt, LPBYTE data );
BOOL WriteDevice_Ack();
BOOL SetBaud( int nBaud );
int FX_GetDevAddr(LPSTR strDev, XDEV *pDev);
//----------------------------------------------------------------
BOOL ReadBfm( int nUnit, int addr, int nDevCnt, LPBYTE data );
BOOL WriteBfm( int nUnit, int addr, int nDevCnt, LPBYTE data );
//BOOL WriteDevice( LPSTR strDev, int nDevCnt, LPBYTE data );
};
DGX_API BOOL _stdcall WriteDevice( LPSTR strDev, int nDevCnt, LPBYTE data ); (这个就是我要调用的函数)
注:我感觉还是我的头文件那里有点问题,请各位帮忙看看。非常感谢。
EXTERN_C __declspec(dllexport) BOOL WINAPI ExportedWriteBfm(int nUnit,int addr,int nDevCnt,LPBYTE data)
{
return CDGX::WriteBfm(int nUnit,int addr,int nDevCnt,LPBYTE data);
}
C#中引用
[DllImport("ExportedWriteBfm",CallingConvention=CallingConvention.StdCall)]
public unsafe static extern bool ExportedWriteBfm(int nUnit,int addr,int nDevCnt,byte* data);
// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DGX_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// DGX_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef DGX_EXPORTS
#define DGX_API extern "C" __declspec(dllexport)
#else
#define DGX_APIextern "C" __declspec(dllimport)
#endif
// CSerial.h
#ifndef __DGX_FX_PORT_H__
#define __DGX_FX_PORT_H__
#include "define.h"
#include "Serial.h"
/*
#define DEVBUF_D 0X4000 //D0000-D7999
#define DEVBUF_D8 0X8000 //D8000-D8511
#define DEVBUF_M 0X8800 //M0-M7679(1)
#define DEVBUF_Y 0X8BC0 //Y0-Y377(1)
#define DEVBUF_M8 0X8C00
#define DEVBUF_CX 0X8C40 //C0-C255(触点)
#define DEVBUF_TX 0X8C60 //T0-T511(触点)
#define DEVBUF_X 0x8CA0 //X0-X377 256
#define DEVBUF_S 0X8CE0 //8CE0-8EE0 S0-S4095 768
#define BDEV_S 0
#define BDEV_X 1
#define BDEV_Y 2
#define BDEV_TX 3
#define BDEV_M 4
#define BDEV_CX 5
#define BDEV_M8 6
#define BDEV_Db 7
#define BDEV_KnS 8
#define BDEV_KnX 9
#define BDEV_KnY 10
#define BDEV_KnM 12
#define BDEV_KnM8 14
#define WDEV_D 16
#define WDEV_D8 17
#define WDEV_R 18
#define WDEV_TV 19
#define WDEV_CV1 20
#define WDEV_CV2 21
#define WDEV_UG 22
#define WDEV_KH 23
#define DEV_ERR 24
*/
#define MAX_UART_TRY 3
class CDGX
{
public:
CDGX();
~CDGX();
CSerial *pPort;
int m_nUartStopFlag;
int m_nPort, m_nBaud;
int m_nSend, m_nRecv, m_nError;
BOOL Open(int port, int baud );
public:
BOOL ShakeHandle();
BOOL SetBitDevice( LPSTR strDev, int data );
BOOL SetBitDevice( UINT addr, int data );
BOOL ReadDevice( LPSTR strDev, int nDevCnt, LPBYTE data );
BOOL ReadDevice( UINT addr, int nDevCnt, LPBYTE data );
int ReShakeHandle(int mode = 1);
int ReceData( BYTE *buffer, int limit );
void SendReq( LPBYTE SendBuf, int nSendLength );
BOOL WriteDevice( LPSTR strDev, int nDevCnt, LPBYTE data );
BOOL WriteDevice( UINT addr, int nDevCnt, LPBYTE data );
BOOL WriteDevice_Ack();
BOOL SetBaud( int nBaud );
int FX_GetDevAddr(LPSTR strDev, XDEV *pDev);
//----------------------------------------------------------------
BOOL ReadBfm( int nUnit, int addr, int nDevCnt, LPBYTE data );
BOOL WriteBfm( int nUnit, int addr, int nDevCnt, LPBYTE data );
};
#endif
DGX_API BOOL WriteDevice( LPSTR strDev, int nDevCnt, LPBYTE data )
这个是DGX.cpp文件中的。
// DGX.cpp : 定义 DLL 应用程序的导出函数。
//
// CIoport.cpp
#include "stdafx.h"
#include "DGX.h"
#include "stdlib.h"
//extern UINT m_nUartStopFlag
;
//
//外部其它程序传送的终止标志, 不等于0时,终止任何串口传送.
CDGX::CDGX()
{
m_nSend = m_nRecv = m_nError = 0;
pPort = NULL;
}
CDGX::~CDGX()
{
if( pPort != NULL )
{
pPort->Close();
delete pPort;
pPort = NULL;
}
}
//============================================================================
BOOL CDGX::WriteDevice( LPSTR strDev, int nDevCnt, LPBYTE data )
{
XDEV pDev;
UINT addr;
if( FX_GetDevAddr( strDev, &pDev ) == 0 )
return FALSE;
switch(pDev.Name)
{
case BDEV_M: addr = DEVBUF_M + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_M8: addr = DEVBUF_M8 + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_S: addr = DEVBUF_S + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_X: addr = DEVBUF_X + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_Y: addr = DEVBUF_Y + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case WDEV_D: addr = DEVBUF_D + pDev.Number * 2; break;
case WDEV_D8: addr = DEVBUF_D8 + pDev.Number * 2; break;
case WDEV_R: addr = 0x60000 + pDev.Number * 2; break;
default:
return FALSE;
}
return WriteDevice( addr, nDevCnt, data );
}
BOOL CDGX::WriteDevice( UINT addr, int nDevCnt, LPBYTE data )
{
BYTE buf[530];//最大524
LPBYTE p = &buf[4];
int i, n, byt;
while( nDevCnt > 0 )
{
if( m_nUartStopFlag != 0 )
return FALSE;//强制终止, 返回0
//约束最大发送的数据点数
if( nDevCnt > 127 )
n = 127;
else
n = nDevCnt;
//生成代发送数据
p[0] = 0xe1;
p[1] = ((addr>>12)&0x0f);
if( (addr>>16) != 0 )
p[1] |= 0x60;
p[2] = (addr>>4)&0xff;
p[3] = (addr<<4)&0xf0;
p = &p[3];
byt = n*2;//字节数
*p++ |= (byt>>4 ) & 0xf;
*p = (byt<<4) & 0xf0;
for( i=0; i<byt; i++ )
{
int Q = *data++;
*p++ |= (Q>>4 ) & 0xf;
*p = (Q<<4) & 0xf0;
}
//发送
for( i = 0; i < MAX_UART_TRY; i++ )
{
SendReq( buf, n*4 + 9 );
if( WriteDevice_Ack() )
break;
if( m_nUartStopFlag != 0 )
return FALSE;//强制终止, 返回0
ReShakeHandle(1);
}
if( i == MAX_UART_TRY )
return FALSE;
nDevCnt -= n;
addr += byt;
data += byt;
}
return TRUE;
}
BOOL CDGX::WriteDevice_Ack()
{
BYTE buf[8];
if( ReceData( buf, 4 ) == 4 )
return ( *(UINT*)&buf[0] == 0x013302cc );
return FALSE;
}
BOOL CDGX::ReadDevice( LPSTR strDev, int nDevCnt, LPBYTE data )
{
XDEV pDev;
UINT addr;
if( FX_GetDevAddr( strDev, &pDev ) == 0 )
return FALSE;
switch(pDev.Name)
{
case BDEV_M: addr = DEVBUF_M + (pDev.Number/16*2); nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_M8: addr = DEVBUF_M8 + (pDev.Number/16*2); nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_S: addr = DEVBUF_S + (pDev.Number/16*2); nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_X: addr = DEVBUF_X + (pDev.Number/16*2); nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_Y: addr = DEVBUF_Y + (pDev.Number/16*2); nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case WDEV_D: addr = DEVBUF_D + pDev.Number * 2; break;
case WDEV_D8: addr = DEVBUF_D8 + pDev.Number * 2; break;
case WDEV_R: addr = 0x60000 + pDev.Number * 2; break;
default:
return FALSE;
}
return ReadDevice( addr, nDevCnt, data );
}
BOOL CDGX::WriteBfm( int nUnit, int addr, int nDevCnt, LPBYTE data )
{
BYTE buf[530];//最大524
LPBYTE p = &buf[4];
int i, n, byt;
while( nDevCnt > 0 )
{
if( m_nUartStopFlag != 0 )
return FALSE;
if( nDevCnt > 127 )
n = 127;
else
n = nDevCnt;
p[0] = 0xf1;
p[1] = ((nUnit<<4)&0xf0) | ((addr>>12)&0xf);
p[2] = (addr>>4)&0xff;
p[3] = (addr<<4)&0xf0;
p = &p[3];
byt = n*2;//字节数
*p++ |= (byt>>4 ) & 0xf;
*p = (byt<<4) & 0xf0;
//数据
for( i=0; i<byt; i++ )
{
int Q = *data++;
*p++ |= (Q>>4 ) & 0xf;
*p = (Q<<4) & 0xf0;
}
for( i = 0; i < MAX_UART_TRY; i++ )
{
SendReq( buf, n*4 + 9 );
if( WriteDevice_Ack() )
break;
if( m_nUartStopFlag != 0 )
return FALSE;
ReShakeHandle(1);
}
if( i == MAX_UART_TRY )
return FALSE;
nDevCnt -= n;
addr += byt;
data += byt;
}
return TRUE;
}
int CDGX::FX_GetDevAddr(LPSTR strDev, XDEV* pDev)
{
pDev->Name = DEV_ERR; //#define DEV_ERR 24
char c = strDev[0];
int nDevNumber;
strDev++;
CString str;
str = strDev;
nDevNumber = atoi(str); //功 能: 把字符串转换成长整型数
if( c == 'M')
{
if( nDevNumber < 8000 )
{
pDev->Number = nDevNumber;
pDev->Name = BDEV_M;
return 1;
}
else if( nDevNumber < 8512 )
{
pDev->Number = nDevNumber-8000;
pDev->Name = BDEV_M8;
return 1;
}
}
else if( c == 'S')
{
if( nDevNumber < 4096 )
{
pDev->Number = nDevNumber;
pDev->Name = BDEV_S;
return 1;
}
}
else if( c == 'X')
{
if( nDevNumber <= 377 )
{
pDev->Number = (nDevNumber/100)*64;
nDevNumber = nDevNumber %100;
pDev->Number += (nDevNumber/10)*8 + (nDevNumber%10);
pDev->Name = BDEV_X;
return 1;
}
}
else if( c == 'Y')
{
if( nDevNumber <= 377 )
{
pDev->Number = (nDevNumber/100)*64;
nDevNumber = nDevNumber %100;
pDev->Number += (nDevNumber/10)*8 + (nDevNumber%10);
pDev->Name = BDEV_Y;
return 1;
}
}
else if( c == 'D')
{
if( nDevNumber < 8000 )
{
pDev->Number = nDevNumber;
pDev->Name = WDEV_D;//16
return 1;
}
else if( nDevNumber < 8512 )
{
pDev->Number = nDevNumber-8000;
pDev->Name = WDEV_D8;//17
return 1;
}
}
else if( c == 'R')
{
if( nDevNumber < 32768 )
{
pDev->Number = nDevNumber;
pDev->Name = WDEV_R;
return 1;
}
}
return 0;
}
嘿嘿,代码有点多,不好意思呢。谢谢// 12.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "12.h"
BOOL WriteDevice( LPSTR strDev, int nDevCnt, LPBYTE data )
{
XDEV pDev;
UINT addr;
if( FX_GetDevAddr( strDev, &pDev ) == 0 )
return FALSE;
switch(pDev.Name)
{
case BDEV_M: addr = DEVBUF_M + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_M8: addr = DEVBUF_M8 + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_S: addr = DEVBUF_S + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_X: addr = DEVBUF_X + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_Y: addr = DEVBUF_Y + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case WDEV_D: addr = DEVBUF_D + pDev.Number * 2; break;
case WDEV_D8: addr = DEVBUF_D8 + pDev.Number * 2; break;
case WDEV_R: addr = 0x60000 + pDev.Number * 2; break;
default:
return FALSE;
}
return WriteDevice( addr, nDevCnt, data );
}
int CDGX::FX_GetDevAddr(LPSTR strDev, XDEV* pDev)
{
pDev->Name = DEV_ERR; //#define DEV_ERR 24
char c = strDev[0];
int nDevNumber;
strDev++;
CString str;
str = strDev;
nDevNumber = atoi(str); //功 能: 把字符串转换成长整型数
if( c == 'M')
{
if( nDevNumber < 8000 )
{
pDev->Number = nDevNumber;
pDev->Name = BDEV_M;
return 1;
}
else if( nDevNumber < 8512 )
{
pDev->Number = nDevNumber-8000;
pDev->Name = BDEV_M8;
return 1;
}
}
else if( c == 'S')
{
if( nDevNumber < 4096 )
{
pDev->Number = nDevNumber;
pDev->Name = BDEV_S;
return 1;
}
}
else if( c == 'X')
{
if( nDevNumber <= 377 )
{
pDev->Number = (nDevNumber/100)*64;
nDevNumber = nDevNumber %100;
pDev->Number += (nDevNumber/10)*8 + (nDevNumber%10);
pDev->Name = BDEV_X;
return 1;
}
}
else if( c == 'Y')
{
if( nDevNumber <= 377 )
{
pDev->Number = (nDevNumber/100)*64;
nDevNumber = nDevNumber %100;
pDev->Number += (nDevNumber/10)*8 + (nDevNumber%10);
pDev->Name = BDEV_Y;
return 1;
}
}
else if( c == 'D')
{
if( nDevNumber < 8000 )
{
pDev->Number = nDevNumber;
pDev->Name = WDEV_D;//16
return 1;
}
else if( nDevNumber < 8512 )
{
pDev->Number = nDevNumber-8000;
pDev->Name = WDEV_D8;//17
return 1;
}
}
else if( c == 'R')
{
if( nDevNumber < 32768 )
{
pDev->Number = nDevNumber;
pDev->Name = WDEV_R;
return 1;
}
}
return 0;
}
我想可能是我方法那还有问题,不知你上面给我的示例是如何完成的,没有报这个错误。
EXTERN_C __declspec(dllexport) BOOL WINAPI ExportedWriteBfm(int nUnit,int addr,int nDevCnt,LPBYTE data)
{
return CDGX::WriteBfm(int nUnit,int addr,int nDevCnt,LPBYTE data);
}
[/quote]
你这个写错了吧,FX_GetDevAddr是类中的静态函数吧,得CDGX::FX_GetDevAddr这样调用// 12.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "12.h"
BOOL WriteDevice( LPSTR strDev, int nDevCnt, LPBYTE data )
{
XDEV pDev;
UINT addr;
if( FX_GetDevAddr( strDev, &pDev ) == 0 )
return FALSE;
switch(pDev.Name)
{
case BDEV_M: addr = DEVBUF_M + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_M8: addr = DEVBUF_M8 + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_S: addr = DEVBUF_S + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_X: addr = DEVBUF_X + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case BDEV_Y: addr = DEVBUF_Y + (pDev.Number/16)*2; nDevCnt = (nDevCnt+(pDev.Number&0xf)+15)/16; break;
case WDEV_D: addr = DEVBUF_D + pDev.Number * 2; break;
case WDEV_D8: addr = DEVBUF_D8 + pDev.Number * 2; break;
case WDEV_R: addr = 0x60000 + pDev.Number * 2; break;
default:
return FALSE;
}
return WriteDevice( addr, nDevCnt, data );
}
int CDGX::FX_GetDevAddr(LPSTR strDev, XDEV* pDev)
{
pDev->Name = DEV_ERR; //#define DEV_ERR 24
char c = strDev[0];
int nDevNumber;
strDev++;
CString str;
str = strDev;
nDevNumber = atoi(str); //功 能: 把字符串转换成长整型数
if( c == 'M')
{
if( nDevNumber < 8000 )
{
pDev->Number = nDevNumber;
pDev->Name = BDEV_M;
return 1;
}
else if( nDevNumber < 8512 )
{
pDev->Number = nDevNumber-8000;
pDev->Name = BDEV_M8;
return 1;
}
}
else if( c == 'S')
{
if( nDevNumber < 4096 )
{
pDev->Number = nDevNumber;
pDev->Name = BDEV_S;
return 1;
}
}
else if( c == 'X')
{
if( nDevNumber <= 377 )
{
pDev->Number = (nDevNumber/100)*64;
nDevNumber = nDevNumber %100;
pDev->Number += (nDevNumber/10)*8 + (nDevNumber%10);
pDev->Name = BDEV_X;
return 1;
}
}
else if( c == 'Y')
{
if( nDevNumber <= 377 )
{
pDev->Number = (nDevNumber/100)*64;
nDevNumber = nDevNumber %100;
pDev->Number += (nDevNumber/10)*8 + (nDevNumber%10);
pDev->Name = BDEV_Y;
return 1;
}
}
else if( c == 'D')
{
if( nDevNumber < 8000 )
{
pDev->Number = nDevNumber;
pDev->Name = WDEV_D;//16
return 1;
}
else if( nDevNumber < 8512 )
{
pDev->Number = nDevNumber-8000;
pDev->Name = WDEV_D8;//17
return 1;
}
}
else if( c == 'R')
{
if( nDevNumber < 32768 )
{
pDev->Number = nDevNumber;
pDev->Name = WDEV_R;
return 1;
}
}
return 0;
}
我想可能是我方法那还有问题,不知你上面给我的示例是如何完成的,没有报这个错误。
EXTERN_C __declspec(dllexport) BOOL WINAPI ExportedWriteBfm(int nUnit,int addr,int nDevCnt,LPBYTE data)
{
return CDGX::WriteBfm(int nUnit,int addr,int nDevCnt,LPBYTE data);
}
bReadStatus = ReadFile( m_hIDComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );
bWriteStat = WriteFile( m_hIDComDev, (LPSTR) &ucByte, 1, &dwBytesWritten, &m_OverlappedWrite );
BOOL Open( int nPort, int nBaud, int nDataBits=8 );
BOOL Close( void );
也就是说,其它的函数都是用来进行数据处理的,为以上函数服务。
D:我现在用VS2008 C#来写的,利用其自带的控件SerialPort,它也有上面类似的四个方法
public void Write(byte[] buffer, int offset, int count);
public int Read(byte[] buffer, int offset, int count);
E:现在想利用原代码,将其做成DLL,供在C#中调用,然后用C#中的串口读取数据的方法来替换原代码中C++中读取数据的函数。(主要是想利用原代码中那些辅助数据处理方法,和满足老板的要求。)
byte[] buf = new byte[530];
改为
byte* pbuf = stackalloc byte[530];
把数组分配到栈里,本身就是固定的,而且性能更好,后面直接byte* p = &buf[4],不用fixed