Возникла не понятка. Нужна помощь.
Есть у меня DLL в ней есть функция для посылке комманды на COM порт
extern "C"
{
....
__declspec (dllexport) int sendCmd(char *textCMD, char *paramCMD, bool isParam);
....
}
_cTIMER *Timer = NULL;
__declspec (dllexport) int sendCmd(char *textCMD, char *paramCMD, bool isParam)
{
DWORD BytesReceived;
DWORD BytesWritten;
char CSend='\0';
PurgeComm(hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
WriteFile(hComm,"\r",1,&BytesWritten,NULL);
Timer = new _cTIMER(5000);
while (!Timer->TimeOUT())
{
ReadFile(hComm,&CSend,1,&BytesReceived,NULL);
if (CSend == '>') break;
}
if (Timer->TimeOUT()){
delete Timer;
return -1;
}
else
delete Timer;
char buffCMD[255];//new char (StrLen(textCMD)+StrLen(paramCMD));
ZeroMemory(&buffCMD,sizeof(buffCMD));
strcpy(buffCMD,textCMD);
strcat(buffCMD,paramCMD);
unsigned len = lstrlen(buffCMD);
for (unsigned int i=0;i<len;i++)
{
CSend = buffCMD[i];
WriteFile(hComm,&CSend,1,&BytesWritten,NULL);
Timer = new _cTIMER(5000);
while (!Timer->TimeOUT()){
CSend = '\0';
ReadFile(hComm,&CSend,1,&BytesReceived,NULL);
if (BytesReceived!=0)
// f << ">> Read char: " << CSend << " | " << IntToHex(CSend,2).c_str() << endl;
if (buffCMD[i] == CSend) break;
}
if (Timer->TimeOUT()){
delete Timer;
return -1;
}
else
delete Timer;
}
WriteFile(hComm,"\r",1,&BytesWritten,NULL);
delete[] buffCMD;
// ---------------------------------
if (isParam){
//char readStr[512];
//ZeroMemory(&readStr,sizeof(readStr));
//int charcount = 0;
// f << ">> Param present"<< endl;
//strcpy(paramCMD,textCMD);
//strcat(paramCMD," ");
//for (unsigned int i=0;i<(unsigned)lstrlen(paramCMD);i++) *paramCMD++;
for (unsigned int i=0;i<(unsigned)lstrlen(textCMD)-1;i++)
{
*paramCMD = textCMD[i];
*paramCMD++;
}
Timer = new _cTIMER(3000);
while (!Timer->TimeOUT()){
ReadFile(hComm,&CSend,1,&BytesReceived,NULL);
if (BytesReceived!=0) {
*paramCMD = CSend;*paramCMD++;
}
if (CSend == '\r') { break;}
}
if (Timer->TimeOUT()){
delete Timer;
return -1;
}
else
delete Timer;
}
return 0;
}
Смысл фунции такой
Посылает 0х13 в ответ получаем ">" и посимвольно с проверкой посылаем комманду. Комманды бываю двух типов без ответа "go" и с ответом "pl" в ответ "1230 23.5 34". Так же в комманде могут передаваться сами значения "pl 1000".
Теперь в самой программе делую так
в заголовке
private: // User declarations
....
typedef __declspec (dllexport) int sendCmdType(char *textCMD, char *paramCMD, bool isParam);
....
public: // User declarations
....
sendCmdType* sendCmd;
....
в СРР файле
DrvDll = LoadLibrary("ComPortProject.dll");
if (DrvDll)
{
sendCmd = (sendCmdType*)GetProcAddress(DrvDll,"_sendCmd");
}
Ну и наконец вызов функции
....
char cmd[256] = {0};
....
sendCmd(CMDID.c_str(),cmd,readData);
...
readData если был true идет обработка параметров cmd.
Загвоздка в следующем, когда я компилю проект в DEBUG все отлично выполняет и работает, как только делаю релиз возникает ошибка "нарушен доступ по адрессу в DLL". В чем дело не пойму. Есть предположения что я не правильно работаю с параметрами функции. Мне не нужно передать два параметра в одном комманда, в другой может быть переменные этой комманды или этот параметер должен вернуть считыные переменные с COM порта.
Заметил вот еще что, если отключить в настройках "Optimazation Code: none", то все начинает работать.