关于dll 和 串口(请好心人帮忙)

reekyding 2004-05-06 04:55:40
想做一个dll和串口通讯,遇到如下问题:
我在工程中加入mscomm 控件,但不知道怎么将mscomm类实例化。比如我在做基于对话框的MFC的exe时用到
CMSComm m_ComPort
m_ComPort.Create( NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM ),现在因为是dll没有了dialog 和 IDC_MSCOMM ,我没有办法创建,怎么办?

急,望好心人多多帮忙!
...全文
70 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
reekyding 2004-05-09
  • 打赏
  • 举报
回复
lfchen(一条晚起的虫) , 改为_stdcall 错误一样的!
一条晚起的虫 2004-05-09
  • 打赏
  • 举报
回复
改为_stdcall试试
reekyding 2004-05-09
  • 打赏
  • 举报
回复
我为什么还不行!
我是这样做的,新建一个dll,比如命名为testdll , 然后我把你给我的代码,全都放在testdll.cpp里(包括你给我的当作头文件的 函数声明 ),这样编译就通过。

但是到PB的程序里调用,出现错误, error.number = 14 .

我觉得是dll没有做对,你帮我看看啊!急!谢谢!
zhangnanonnet 2004-05-09
  • 打赏
  • 举报
回复
我刚才测试了一下我的代码,没有问题
zhangnanonnet 2004-05-09
  • 打赏
  • 举报
回复
没问题,PB啊,哈哈哈哈.....我最熟的就是PB了,哈哈哈,我从PB5开始用到8,可惜现在不用PB很久了.....在PB版上我也只是2个角,不经常去.对了,用PB调用,参数的输出值声名记得加ref,如果是字符串记得把字符串space(),呵呵,不过你既然是用pb的,这些应该都很熟了,呵呵,不过我见过好多写PB程序的在这些方面总是忘
reekyding 2004-05-09
  • 打赏
  • 举报
回复
谢谢CSDN给我们这样的环境交流.特别感谢zhangnanonnet(鱼欢) ,还有给我帮助的所有人!
zhangnanonnet 2004-05-09
  • 打赏
  • 举报
回复
idComDev就是上边提到的串口句柄m_gphdCom
zhangnanonnet 2004-05-09
  • 打赏
  • 举报
回复
idComDev就是上边提到的串口句柄m_gphdCom
zhangnanonnet 2004-05-09
  • 打赏
  • 举报
回复
// 以下代码用同步方式实现,故open的第三个参数是false
bool SendStrCommand(CString CommandWord) //发送字符串命令
{
DWORD t1,dwRead;
COMSTAT t2;

CString Command("");
Command+=CommandWord;

// 组合命令串
WriteFile(
idComDev,
Command.GetBuffer (Command.GetLength ()),
Command.GetLength (),
&dwRead,
NULL);

if(!ClearCommError(idComDev,&t1,&t2))
{
switch(t1)
{
case CE_OOP:
TRACE("G CE_OOP\n");
return false;
break;
case CE_PTO://超时错误
TRACE("G CE_PTO\n");
return false;
break;
case CE_IOE:
TRACE("G CE_IOE\n");
return false;
break;
}
}

return true;
}

CString ReceiveStr()
{
char tmp[2];
DWORD dwBytesRead;
CString retvalue;
int i(0), iCount(0);
BOOL bReturn;

memset(tmp,0,2);

bReturn = ReadFile(idComDev, tmp, 1, &dwBytesRead, NULL);

if (dwBytesRead < 1)
{
return "";
}

do
{
retvalue += tmp;
memset(tmp,0,2);
bReturn = ReadFile(idComDev, tmp, 1, &dwBytesRead, NULL);
i++;
}
while(dwBytesRead == 1);

return retvalue;
}
reekyding 2004-05-09
  • 打赏
  • 举报
回复
有啊,我的MSN , reekyding@hotmail.com
zhangnanonnet 2004-05-09
  • 打赏
  • 举报
回复
不行的话你有MSN之类的没有....我帮你改得了
zhangnanonnet 2004-05-09
  • 打赏
  • 举报
回复
哥们,你是不是没有在.def文件中导出这几个函数啊
在def文件中加上
Open
Close
Write
Read
应该就可以了
reekyding 2004-05-08
  • 打赏
  • 举报
回复
好的,还有我这个DLL是做给PB的程序用的,这样调用起来会不会有问题!
谢谢了!
zhangnanonnet 2004-05-08
  • 打赏
  • 举报
回复
我给你的应该是可以的,那个是我作的公司一个硬件产品DLL的通讯层代码的一部分,应该是可以的。open close write read这4个最基本的都有了。你测试一下,有什么问题明天白天上班我可以帮你解决
reekyding 2004-05-08
  • 打赏
  • 举报
回复
好啊,太感谢了。你给我的代码可以直接用的吗?要是这样话我就用你的了!呵呵!
zhangnanonnet 2004-05-08
  • 打赏
  • 举报
回复

// 写串口
extern "C" BOOL PASCAL Write(BYTE *buf,int buflen)
{
BOOL fWriteStat;
DWORD dwErrorFlags;
DWORD dwError;
COMSTAT ComStat;
char szError[ 10 ] ;
DWORD ret;

if (fCOMMOpened==0)
{
return FALSE;//串口未打开
}

ret=0;
if (olap)
{
fWriteStat = WriteFile(m_gphdCom,buf,buflen,&ret, &WRITE_OS ) ;
if (!fWriteStat)
{
if ((dwError=GetLastError()) == ERROR_IO_PENDING)
{

while (!GetOverlappedResult(m_gphdCom,&WRITE_OS,&ret, TRUE ))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
{
OutputDebugString("write io pending");
continue;
}
else
{
//an error occurred, try to recover
wsprintf( szError, "\n\r <CE-%u>", dwError ) ;
OutputDebugString(szError);
ClearCommError(m_gphdCom, &dwErrorFlags, &ComStat ) ;
if (dwErrorFlags > 0)
{
wsprintf( szError, "\n\r <CE-%u>",dwErrorFlags ) ;
OutputDebugString(szError);
}
break;
}
}
}
else
{
// some other error occurred
wsprintf( szError, "\n\r <CE-%u>", dwError ) ;
OutputDebugString(szError);
ClearCommError(m_gphdCom,&dwErrorFlags,&ComStat ) ;

if (dwErrorFlags>0)
{
wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags) ;
OutputDebugString(szError);
}
return FALSE;
}
}

}
else
{
fWriteStat = WriteFile(m_gphdCom, buf,(DWORD)buflen,&ret, NULL);
if (!fWriteStat)
{
if(GetLastError() == ERROR_IO_PENDING)
{
dwError = GetLastError();
// an error occurred, try to recover
wsprintf( szError, "\n\r <CE-%u>", dwError ) ;
OutputDebugString(szError);
ClearCommError(m_gphdCom, &dwErrorFlags, &ComStat ) ;
if (dwErrorFlags >0)
{
wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ;
OutputDebugString(szError);
}
}
else
{
// some other error occurred
ClearCommError(m_gphdCom, &dwErrorFlags, &ComStat ) ;
if (dwErrorFlags > 0)
{
wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ;
OutputDebugString(szError);
}
return FALSE;
}
}
}

return TRUE;
}

// 读串口
extern "C" BOOL PASCAL Read(BYTE *buf,int nMaxLength)
{
BOOL fReadStat ;
COMSTAT ComStat;
DWORD dwErrorFlags;
DWORD dwLength;
DWORD dwError;
char szError[ 10 ];

if (fCOMMOpened==0)
{
return FALSE; //串口未打开
}

// only try to read number of bytes in queue
ClearCommError(m_gphdCom, &dwErrorFlags, &ComStat) ;
//dwLength = min( (DWORD) nMaxLength, ComStat.cbInQue ) ;

dwLength=nMaxLength;
if (dwLength > 0)
{
if (olap==TRUE)
{
fReadStat = ReadFile(m_gphdCom,buf, dwLength, &dwLength,&READ_OS) ;
if (!fReadStat)
{
if (GetLastError() == ERROR_IO_PENDING)
{
OutputDebugString("\n\rIO Pending");
while(!GetOverlappedResult(m_gphdCom, &READ_OS,
&dwLength, TRUE ))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE) continue;
else
{
// an error occurred, try to recover
ClearCommError(m_gphdCom,&dwErrorFlags, &ComStat ) ;
break;
}
}
}
else // end-----if (GetLastError() == ERROR_IO_PENDING)
{
// some other error occurred

dwLength = 0 ;
ClearCommError(m_gphdCom, &dwErrorFlags, &ComStat ) ;
if (dwErrorFlags >0)
{
wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ;
OutputDebugString(szError);
}
}
} // end-----if (!fReadStat)
} // end-----if (olap==TRUE)
else
{
fReadStat = ReadFile( m_gphdCom,buf, dwLength, &dwLength, NULL ) ;
if (!fReadStat)
{
dwError = GetLastError();
ClearCommError(m_gphdCom,&dwErrorFlags, &ComStat ) ;

if (dwErrorFlags >0)
{
wsprintf( szError, "\n\r <CE-%u>", dwErrorFlags ) ;
OutputDebugString(szError);
}
}
}
}

return TRUE;
}
zhangnanonnet 2004-05-08
  • 打赏
  • 举报
回复
// CommDLL.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "CommDLL.h"

BOOL set_baudrate(int baud_rate);
BOOL SetTimeOut(DWORD ReadIntervalTimeout,
DWORD ReadTotalTimeoutMultiplier,
DWORD ReadTotalTimeoutConstant);


HANDLE m_gphdCom;

int fCOMMOpened;
OVERLAPPED WRITE_OS,READ_OS;
BOOL olap; // overlapped 方式
HANDLE hCommWatchThread;
DWORD dwThreadID ;


// 函数体
// 设置串口超时
BOOL SetTimeOut(DWORD ReadIntervalTimeout,
DWORD ReadTotalTimeoutMultiplier,
DWORD ReadTotalTimeoutConstant)
{
COMMTIMEOUTS timeouts;

GetCommTimeouts(m_gphdCom,&timeouts);
timeouts.ReadIntervalTimeout=ReadIntervalTimeout;
timeouts.ReadTotalTimeoutMultiplier=ReadTotalTimeoutMultiplier;
timeouts.ReadTotalTimeoutConstant=ReadTotalTimeoutConstant;
return SetCommTimeouts(m_gphdCom,&timeouts);
}

// 设置串口波特率
BOOL set_baudrate(int baud_rate)
{
DCB dcb;
BOOL fsuccess;

fsuccess = GetCommState(m_gphdCom, &dcb);
if (!fsuccess)
{
return FALSE;
}

dcb.BaudRate =baud_rate;
dcb.ByteSize =8; //number of bits/byte, 4-8
dcb.Parity =NOPARITY;
dcb.StopBits =ONESTOPBIT;
//dcb.EvtChar=0x02;
//dcb.fNull=TRUE;

fsuccess=SetCommState(m_gphdCom, &dcb);
if (!fsuccess)
{
return FALSE;
}

return TRUE;
}
// 打开串口
extern "C" BOOL PASCAL Open(char *szPort,int Baud_rate, BOOL overlapped)
{
int retbuflength=0;

if (overlapped)
{ //异步方式打开串口
memset( &READ_OS, 0, sizeof( OVERLAPPED ) ) ;
memset( &WRITE_OS, 0, sizeof( OVERLAPPED ) ) ;

READ_OS.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL ) ; // no name
if (READ_OS.hEvent == NULL)
{
return FALSE;
}

WRITE_OS.hEvent = CreateEvent( NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL ) ; // no name
if (NULL == WRITE_OS.hEvent)
{
CloseHandle( READ_OS.hEvent ) ;
return FALSE;
}

m_gphdCom=CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|
FILE_FLAG_OVERLAPPED, // overlapped I/O
NULL );

olap=TRUE;
} //同步方式打开串口
else
{
m_gphdCom=CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
0, //is overlapped or no
NULL );
}

if (m_gphdCom==(HANDLE) -1)
{
DWORD RR=GetLastError();
CloseHandle(m_gphdCom) ;
if (olap)
{
CloseHandle( READ_OS.hEvent ) ;
CloseHandle( WRITE_OS.hEvent ) ;
}
fCOMMOpened=0;
olap=FALSE;
return FALSE;
}

set_baudrate(Baud_rate);
fCOMMOpened=1;
SetupComm(m_gphdCom,11520,2048);
PurgeComm(m_gphdCom, PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
SetCommMask(m_gphdCom,EV_RXCHAR/* EV_RXFLAG*/ );
//set time out
SetTimeOut(10,100,500);
return TRUE;
}

// 关闭串口
extern "C" BOOL PASCAL Close()
{
if (fCOMMOpened==1)
{
fCOMMOpened=0;
CloseHandle(m_gphdCom) ;
olap=FALSE;
if (olap)
{
CloseHandle( READ_OS.hEvent ) ;
CloseHandle( WRITE_OS.hEvent ) ;
}
return TRUE;
}
return FALSE;
}
zhangnanonnet 2004-05-08
  • 打赏
  • 举报
回复
这样啊。。。。那你跟踪一下m_gphdCom的值吧,看看它WRITE时的值是不是还是OPEN之后的值,如果不是,那一定是什么地方改变它了,实在不行你就把m_gphdCom也作为一个参数在DLL之外传递,open之后传递出来保存在一个全局变量中,不过这段代码我时测试过的阿,不行我明天去公司再给你测试一边。主要时m_gphdCom,WRITE_OS,READ_OS这3个值的问题可能,你在仔细检查一下,只要保证他们都是open时候的值就肯定没有问题
reekyding 2004-05-08
  • 打赏
  • 举报
回复
为什么writefile()就返回false! , 真是不懂了!
我是个新手,多多帮忙!谢谢!
zhangnanonnet 2004-05-08
  • 打赏
  • 举报
回复
哦,是这样。。。。那你跟踪一下WRITE和READ的返回值,看看是否成功
加载更多回复(8)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧