📄 achilles.cpp
字号:
// ACHILLES.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "ACHILLES.h"
#define EXPORT extern "C" __declspec(dllexport)
unsigned char outstr[128]; //通信命令输出缓冲区
unsigned char instr[128]; //通信返回数据缓冲区
HANDLE comm1; //串行口标识句柄
DCB dcb; //串口设置数据控制
COMMTIMEOUTS cto={0,2,5,2,5}; //通信延迟参数
COMSTAT cst; //通信参数
DWORD em; //通信错误状态
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
int __stdcall Add(int a,int b)
{ int c;
c = a + b;
return c;
}
void __stdcall OpenCom(unsigned char ComNo)
{
//串行口初始化
if(ComNo==1)
comm1=CreateFile("COM1",GENERIC_READ+GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,NULL,NULL);
else
comm1=CreateFile("COM2",GENERIC_READ+GENERIC_WRITE,NULL,NULL,OPEN_EXISTING,NULL,NULL);
GetCommState(comm1,&dcb);
BuildCommDCB("9600,n,8,1",&dcb);
SetCommState(comm1,&dcb);
SetupComm(comm1,128,128);
SetCommTimeouts(comm1,&cto);
}
bool __stdcall ReadDev(unsigned char DevAddr,unsigned int *RecBuf)
{
int value;
unsigned long wn=0,rn=0; //辅助变量
unsigned char i,j; //辅助变量
for(i=0;i<128;i++)
{
outstr[i]=0;
instr[i]=0;
}
outstr[0]=DevAddr; //从机地址,0地址为广播
outstr[1]=0x3; //读出命令
outstr[2]=0x0; //读出寄存器地址
outstr[3]=0x10;
outstr[4]=0; //读出寄存器数量
outstr[5]=8;
//以下为CRC计算
wn=0xffff;
for(i=0;i<6;i++)
{ wn ^= outstr[i];
for(j=0;j<8;j++)
{ if(wn&0x1)
wn = (wn>>1)^0xa001;
else
wn = wn>>1;
}
}
outstr[i] = (unsigned char)(wn&0xff);
outstr[i+1] = (unsigned char)((wn>>8)&0xff);
WriteFile(comm1,outstr,8,&wn,NULL);
FlushFileBuffers(comm1);
Sleep(50);
ReadFile(comm1,instr,64,&rn,NULL);
ClearCommError(comm1,&em,&cst); //可由em参数判断是否有底层错误
PurgeComm(comm1,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
//检查返回字节数和CRC码,若不正确,数据将丢弃
if(rn == 21)
{ //检查CRC校验码
wn = 0xffff;
for(i=0;i<19;i++)
{ wn^=instr[i];
for(j=0;j<8;j++)
{ if(wn&0x1)
wn = (wn>>1)^0xa001;
else
wn = wn>>1;
}
}
if(instr[i]==(wn&0xff) && instr[i+1]==((wn>>8)&0xff))
{ for(i=0;i<8;i++)
{ value = instr[3+2*i];
value = value<<8;
value += instr[3+2*i+1];
*(RecBuf+i) = (value>4095?4095:value);
}
return true;
}
}
return false;
}
void __stdcall CloseCom(unsigned char ComNo)
{
CloseHandle(comm1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -