谁知道com 通讯口编程资料或源码的网址,请帮忙。

guo_jerry 2000-06-27 08:06:00
...全文
712 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
PatrickGamp 2000-06-28
  • 打赏
  • 举报
回复
几乎所有必须的功能全在下面的文件中,有大量的注释,希望你能看明白.
////////////////////////Comm.cpp////////////////////////////////
#include "stdafx.h"

#include "comm.h"

/////////////////////////////////////////////////////
/* ¹ØÓÚ´®¿ÚµÄ¶Á£¬Ð´ºÍ¼àÊÓº¯ÊýµÄʵÏÖ
1:Óû§±ØÐëÊ×Ïȵ÷ÓÃInitComPort½øÐд®¿ÚÊý¾ÝµÄ³õʼ»¯
2:È»ºó,µ÷ÓÃOpenPort´ò¿ª´®¿Ú
3:ÓÃCreateThread´´½¨Ò»¸öWatchCommReadỊ̈߳¬ÒÔ¼àÊÓ´®¿Ú
ÊÇ·ñ¶Áµ½ÁËÊý¾Ý£¬Êý¾ÝµÄÄÚÈÝ.
4:Óû§±ØÐëÔÚÖ÷´°¿ÚÄÚ´¦ÀíÓÉWatchCommRead´«µÝµÄÄÚÈÝ
5:½áÊøʱ£¬Óû§»¹±ØÐëµ÷ÓÃUninitComPort,ÊÍ·ÅÄÚ´æ×ÊÔ´
ÀîµÂ¸Õ 2000-6-18 */
////////////////////////////////////////////////////

/////////////////////////////////////////////////////////
//////////////////´®¿Ú´¦Àíº¯Êý///////////////////////////

OVERLAPPED m_osWrite;//5¸öÈ«¾Ö±äÁ¿
OVERLAPPED m_osRead;
HANDLE m_CommHandle;
int m_PortNumber;

//¶ÁÈ¡µÄÊý¾ÝÔÚ´Ë£¬ÎҺܲ»ÇéÔ¸ÓÃÈ«¾Ö±äÁ¿,ÏÞÖÆÊý¾Ý³¤¶È²»³¬¹ý256Bytes.
char m_BufferRead[256];

void InitComPort(int portnumber)
{//³õʼ»¯
if(portnumber<=0)
m_PortNumber=1;
else
m_PortNumber=portnumber;

m_osWrite.hEvent=NULL;
m_osRead.hEvent=NULL;
m_CommHandle=NULL;
}
void UninitComPort()
{//½áÊøʱµ÷ÓÃ,ÊÍ·ÅÄÚ´æ
if(m_CommHandle)
CloseHandle(m_CommHandle);
if(m_osRead.hEvent)
CloseHandle(m_osRead.hEvent);
if(m_osWrite.hEvent)
CloseHandle(m_osWrite.hEvent);
}

HANDLE GetPortHandle()
{//µÃµ½´®¿Ú¾ä±ú
return m_CommHandle;
}

OVERLAPPED GetReadOverlapped()
{//µÃµ½¶ÁµÄOVERLAPPED½á¹¹
return m_osRead;
}

OVERLAPPED GetWriteOverlapped()
{//µÃµ½Ð´µÄOVERLAPPED½á¹¹
return m_osWrite;
}

BOOL SetCommState(DWORD BaudRate,BYTE ByteSize,BYTE Parity,BYTE StopBits)
{//ÉèÖô®¿Ú״̬,±ØÐëÓÃOpenPort()ÒѾ­´ò¿ª´®¿Ú
DCB dcb;
if (m_CommHandle==NULL)
return FALSE;

GetCommState(m_CommHandle, &dcb);

dcb.BaudRate = BaudRate;
dcb.ByteSize = ByteSize;
dcb.Parity = Parity;
dcb.StopBits = StopBits;

return ::SetCommState(m_CommHandle,&dcb);//µ÷ÓÃWin32 APIº¯Êý
}

BOOL WritePort(LPVOID buffer,DWORD numtowrite,LPDWORD numwrite)
{//д´®¿Ú
BOOL writeStatus;
DWORD dwError;

writeStatus = WriteFile(m_CommHandle,//´®¿Ú¾ä±ú
buffer,
numtowrite,
numwrite,
&m_osWrite);

if (!writeStatus) {//д´íÎó
dwError = GetLastError();
if (dwError == ERROR_IO_PENDING) {//ûÓÐдÍê
WaitForSingleObject(m_osWrite.hEvent,1000);
while(!GetOverlappedResult(m_CommHandle,
&m_osWrite,
numwrite,
FALSE));
}
else
dwError = GetLastError();
}

ResetEvent(m_osWrite.hEvent);//ÖÃΪÎÞÐźÅ

return (*numwrite==numtowrite)?TRUE:FALSE;
//×Ö½ÚÊýÏàµÈ£¬·µ»ØÕýÈ·£¬·ñÔò·µ»Ø´íÎó
}

BOOL ReadPort(LPVOID buffer,DWORD numtoread,LPDWORD numread)
{//¶Á´®¿Ú
BOOL rdStatus;
DWORD dwError;

*numread = 0;
rdStatus = ReadFile(m_CommHandle,
buffer,
numtoread,
numread,
&m_osRead);

if (!rdStatus) {
if (GetLastError()==ERROR_IO_PENDING) {//ûÓжÁÍê
while (!GetOverlappedResult(m_CommHandle,
&m_osRead,
numread,
FALSE));
}
else
dwError = GetLastError();
}

ResetEvent(m_osRead.hEvent);
return rdStatus;
}

BOOL OpenPort()
{//´ò¿ª´®¿Ú
COMMTIMEOUTS CommTimeOuts;
char portname[10];

memset(&m_osRead,0,sizeof(m_osRead));
memset(&m_osWrite,0,sizeof(m_osWrite));

//´´½¨¶ÁµÄʼþ
m_osRead.hEvent = CreateEvent(NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL ) ; // no name

if (m_osRead.hEvent == NULL)
return FALSE;

m_osWrite.hEvent = CreateEvent(NULL, // no security
TRUE, // explicit reset req
FALSE, // initial event reset
NULL ) ; // no name

//´´½¨Ð´µÄʼþ
if (m_osWrite.hEvent == NULL){
CloseHandle(m_osRead.hEvent);
m_osRead.hEvent=NULL;
return FALSE;
}

sprintf(portname,"COM%d",m_PortNumber);
m_CommHandle = CreateFile(portname,//´ò¿ª´®¿Ú
GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//overlapped I/O
NULL);
if (m_CommHandle==INVALID_HANDLE_VALUE){//´ò¿ªÊ§°Ü
CloseHandle(m_osRead.hEvent);
m_osRead.hEvent=NULL;
CloseHandle(m_osWrite.hEvent);
m_osWrite.hEvent=NULL;
return FALSE;
}

PurgeComm(m_CommHandle, PURGE_TXABORT | PURGE_RXABORT |//ÇåÀí´®¿Ú
PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

//ÉèÖõÄÑÓʱ×ã¹»½ÓÊÕ200¸ö×Ö·û,ÔÚ9600bpsµÄÇé¿öÏÂ
CommTimeOuts.ReadIntervalTimeout = 5;
CommTimeOuts.ReadTotalTimeoutMultiplier = 100;
CommTimeOuts.ReadTotalTimeoutConstant = 100;
CommTimeOuts.WriteTotalTimeoutMultiplier = 5;
CommTimeOuts.WriteTotalTimeoutConstant = 100;
SetCommTimeouts(m_CommHandle, &CommTimeOuts);//³¬Ê±ÉèÖÃ

return TRUE;
}

BOOL SetModeByString(LPCTSTR str)
{//ͨ¹ý×Ö·û´®ÉèÖô®¿Ú
DCB tmpDcb;

if (!BuildCommDCB(str,&tmpDcb))
return FALSE;

if (m_CommHandle==NULL)
return FALSE;

return ::SetCommState(m_CommHandle,&tmpDcb);
}

///////////////////////////////////////////////
//////ÒÔÉÏÊǹØÓÚ´®¿Ú²Ù×÷µÄËùÓк¯Êý¶¨Òå/////////
///////////////////////////////////////////////

//////////////////////////////////////////
/////¹Û²ì´®¿ÚµÄº¯Êý£¬ËùÓжÔÏó¶¼ÒÀÀµËü/////
/////////±ØÐëÓÃCreateThreadÀ´´´½¨/////////
int WatchCommRead(LPVOID lpVoid)//¶Á´®¿Ú
{ //ÔÚ´Ë֮ǰ±ØÐëÒѾ­´ò¿ª´®¿Ú
OVERLAPPED osRead;
HANDLE handle;
HWND hParentHwnd;

hParentHwnd=(HWND)lpVoid;//´«µÝµÄ²ÎÊýÊǸ¸´°¿ÚµÄ¾ä±ú

osRead=GetReadOverlapped();
handle=GetPortHandle();


if(!::SetCommMask(handle,EV_RXCHAR))
return -1;//±ØÐëÉèÖÃÒ»¸öFlag==EV_RXCHAR

DWORD dwEventMask,dwBytesRead,dwError;
COMSTAT comstat;

while(1){//ÓÀ²»Í£Ï¢µØÔËÐÐ
if(hParentHwnd==NULL)
break;//¸Ã½áÊøÁË
dwEventMask=0;
::WaitCommEvent(handle,&dwEventMask,&osRead);//µÈ´ý´®¿Úʼþ
::WaitForSingleObject(osRead.hEvent,INFINITE);
::ResetEvent(osRead.hEvent);//¸´Î»´®¿Ú£¬²»ÈÃÆäËüʼþ´òÈÅ
if((dwEventMask & EV_RXCHAR)!=EV_RXCHAR)
continue;//ÆäËüʼþ£¬²»ÊǽÓÊÕµ½ÁËÒ»¸ö×Ö·û
Sleep(200);//±ØÐëµÈ´ýÒ»¶Îʱ¼ä£¬·ñÔòÏÂÃæÒ»ÌõÓï¾äºÜÄÑÆð×÷ÓÃ
::ClearCommError(handle,&dwError,&comstat);//µÃµ½ËùÓÐÊý¾Ý

if(!ReadPort(m_BufferRead,comstat.cbInQue,&dwBytesRead))
continue;//ÎÞ·¨¶ÁÈ¡Êý¾Ý
if(dwBytesRead<=0 || dwBytesRead>sizeof(m_BufferRead))
continue;//ûÓжÁÈ¡µ½Êý¾Ý»òÊý¾ÝÌ«¶à²»ÊÇ×Ô¼ºËùÐè
::PostMessage(hParentHwnd,WM_COMMREAD,dwBytesRead,0);
//֪ͨ¸¸´°¿ÚÎÒ´Ó´®¿Ú¶Áµ½ÁËÊý¾Ý²¢ÇÒ±£´æµ½m_BufferReadÁË
}
return 1;
}
很遗憾,中文成了乱码,我没有足够的时间把它改过来.
ARMDEVICE 2000-06-28
  • 打赏
  • 举报
回复
如果要求不是很高的话,建议使用MSCOMM控件。
MSDN上面讲得很相信

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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