急:请教串口通信API方式(先答先给分,分不够再加) rt,请各位大虾赐教。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 HANDLE hCom;void openComClose() { if(hCom) {CloseHandle(hCom); hCom=NULL; return; } HANDLE hCommWatchThread ;//辅助线程的全局函数 hCom =CreateFile("COM4",GENERIC_READ | GENERIC_WRITE,0,// 此项必须为0 NULL,// no security attrs OPEN_EXISTING,//设置产生方式 FILE_FLAG_OVERLAPPED, // 我们准备使用异步通信 NULL ); ASSERT(hCom!=INVALID_HANDLE_VALUE); //检测打开串口操作是否成功 SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY );//设置事件驱动的类型 SetupComm( hCom, 1024,512) ; //设置输入、输出缓冲区的大小 PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); //清干净输入、输出缓冲区 // COMMTIMEOUTS CommTimeOuts ; //定义超时结构,并填写该结构 // CommTimeOuts. // SetCommTimeouts( hCom, &CommTimeOuts ) ;//设置读写操作所允许的超时 DCB dcb;// 定义数据控制块结构 GetCommState(hCom, &dcb ) ; //读串口原来的参数设置 dcb.BaudRate =CBR_9600; dcb.ByteSize =8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT ;dcb.fBinary = TRUE ;dcb.fParity = FALSE; BOOL ff=SetCommState(hCom, &dcb ) ; //串口参数配置 /*hCommWatchThread=CreateThread( (LPSECURITY_ATTRIBUTES) NULL, //安全属性 0,//初始化线程栈的大小,缺省为与主线程大小相同 (LPTHREAD_START_ROUTINE)CommWatchProc, //线程的全局GetSafeHwnd(), //此处传入了主框架的句柄 0, &dwThreadID ); ASSERT(hCommWatchThread!=NULL); */ //OVERLAPPED os; //DWORD dwEvtMask=0 ; //SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY );//有哪些串口事件需要监视? //WaitCommEvent( hCom, &dwEvtMask, &os );// 等待串口通信事件的发生}void read() { OVERLAPPED osRead; memset(&osRead,0,sizeof(OVERLAPPED)); COMSTAT ComStat; DWORD dwLength, dwBytesRead; DWORD dwErrorFlags; osRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); ::ClearCommError(hCom, &dwErrorFlags, &ComStat ) ; dwLength = ComStat.cbInQue ; //输入缓冲区有多少数据? if(dwLength>0){ LPBYTE lpBuffer = new BYTE[dwLength]; BOOL fReadStat; fReadStat = ReadFile( hCom, lpBuffer, dwLength, &dwBytesRead, &osRead); //读数据 DWORD dwError; if (!fReadStat) { dwError=GetLastError(); if (GetLastError() == ERROR_IO_PENDING) { while(!GetOverlappedResult(hCom, &osRead, & dwBytesRead, TRUE )) { dwError = GetLastError(); if(dwError == ERROR_IO_INCOMPLETE) continue; //缓冲区数据没有读完,继续 } } } delete[] lpBuffer;} void Write(LPBYTE buf){fReadStat = WriteFile( hCom, buf, dwLength, &dwBytesWrite, &osWrite); //读数据 } to:netfyee(VC <VS> DELPHI)如果可行,立即揭贴。谢谢! 如何修改菜单栏上的文字 mmio系列函数 两个独立运行的对话框之间如何传递对话框指针 在用property sheet做的选项卡中如何在选项卡头加入icon DWORD 转换成CSTRING ,怎么样返算过来??? 我在对话框上拉了个listbox控件,但不知道怎么改变它的排序方法。 散分 看完了C++ Primer 的人请来说说... 一个小问题,望高手们帮忙解答 谁有启动光盘的镜像文件,或者在什么地方可以下载到呢? 请教一个问题啊,我接到一个项目,准备外包给别人做,一般情况下,我收总价的多少,承包者收总价的多少? 请netfyee来领分
{ if(hCom)
{CloseHandle(hCom);
hCom=NULL;
return;
}
HANDLE hCommWatchThread ;//辅助线程的全局函数
hCom =CreateFile("COM4",GENERIC_READ | GENERIC_WRITE,
0,// 此项必须为0
NULL,// no security attrs
OPEN_EXISTING,//设置产生方式
FILE_FLAG_OVERLAPPED, // 我们准备使用异步通信
NULL );
ASSERT(hCom!=INVALID_HANDLE_VALUE); //检测打开串口操作是否成功
SetCommMask(hCom, EV_RXCHAR|EV_TXEMPTY );//设置事件驱动的类型
SetupComm( hCom, 1024,512) ; //设置输入、输出缓冲区的大小
PurgeComm( hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR
| PURGE_RXCLEAR ); //清干净输入、输出缓冲区
// COMMTIMEOUTS CommTimeOuts ; //定义超时结构,并填写该结构
// CommTimeOuts.
// SetCommTimeouts( hCom, &CommTimeOuts ) ;//设置读写操作所允许的超时
DCB dcb;// 定义数据控制块结构
GetCommState(hCom, &dcb ) ; //读串口原来的参数设置
dcb.BaudRate =CBR_9600; dcb.ByteSize =8; dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT ;dcb.fBinary = TRUE ;dcb.fParity = FALSE;
BOOL ff=SetCommState(hCom, &dcb ) ; //串口参数配置
/*
hCommWatchThread=CreateThread( (LPSECURITY_ATTRIBUTES) NULL, //安全属性
0,//初始化线程栈的大小,缺省为与主线程大小相同
(LPTHREAD_START_ROUTINE)CommWatchProc, //线程的全局
GetSafeHwnd(), //此处传入了主框架的句柄
0, &dwThreadID );
ASSERT(hCommWatchThread!=NULL);
*/
//OVERLAPPED os;
//DWORD dwEvtMask=0 ;
//SetCommMask( hCom, EV_RXCHAR|EV_TXEMPTY );//有哪些串口事件需要监视?
//WaitCommEvent( hCom, &dwEvtMask, &os );// 等待串口通信事件的发生
}void read()
{ OVERLAPPED osRead;
memset(&osRead,0,sizeof(OVERLAPPED));
COMSTAT ComStat;
DWORD dwLength, dwBytesRead;
DWORD dwErrorFlags;
osRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
::ClearCommError(hCom, &dwErrorFlags, &ComStat ) ;
dwLength = ComStat.cbInQue ; //输入缓冲区有多少数据?
if(dwLength>0)
{
LPBYTE lpBuffer = new BYTE[dwLength];
BOOL fReadStat;
fReadStat = ReadFile( hCom,
lpBuffer,
dwLength,
&dwBytesRead,
&osRead); //读数据 DWORD dwError;
if (!fReadStat)
{
dwError=GetLastError();
if (GetLastError() == ERROR_IO_PENDING)
{
while(!GetOverlappedResult(hCom,
&osRead, & dwBytesRead, TRUE ))
{
dwError = GetLastError();
if(dwError == ERROR_IO_INCOMPLETE)
continue; //缓冲区数据没有读完,继续
}
}
}
delete[] lpBuffer;
} void Write(LPBYTE buf)
{
fReadStat = WriteFile( hCom,
buf,
dwLength,
&dwBytesWrite,
&osWrite); //读数据
}
如果可行,立即揭贴。谢谢!