HANDLE hPort;
char   sName[15];
sprintf(sName,"\\\\.\\com%d",port);
hPort = CreateFile(sName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if(hPort == INVALID_HANDLE_VALUE)
return -1;
SetupComm(hPort,1024,512);
PurgeComm(hPort,PURGE_TXABORT|PURGE_RXABORT|
PURGE_TXCLEAR|PURGE_RXCLEAR);
char sSetting[80];
sprintf(sSetting,"%s: baud=%d parity=N data=8 stop=1",sName,boud);
DCB dcb;
GetCommState(hPort,&dcb);
if(!BuildCommDCB(sSetting,&dcb))
{
CloseHandle(hPort);
return -1;
}
if(!SetCommState(hPort,&dcb))
{
CloseHandle(hPort);
return -1;
} COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = interval;
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0; if(!SetCommTimeouts(hPort,&CommTimeOuts))
{
CloseHandle(hPort);
return -1; }
m_hPort=hPort;
return 0;

解决方案 »

  1.   

    用这个语句:sprintf(sName,"com%d",port);时,可以打开9个串口.
    用这个语句:sprintf(sName,"\\\\.\\com%d",port);时,一个串口也打不开.
    我要同时打开24个串口.我的串口是存在的.请教:是为什么?分不够再加.
      

  2.   

    CString   sName;
    sName.Format("\\\\.\\com%d",port);
    hPort = CreateFile(sName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);我刚试过了,可行!
      

  3.   

    1~9的时候用
    hPort = CreateFile(“COMX”,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
    就可以了10以上就需要
    hPort = CreateFile(“\\\\.\\COM10”,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
      

  4.   

    ?!hPort = CreateFile("\\\\.\\com1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);直接试一下,你能打开串口1吗?如果还不行,应该不是这段代码的问题!
      

  5.   

    我知道了!!!!!CreateFile也需要"\\\\.\\com1"形式的字符串,但你和我的方法得出的sName都等于\\.\com1,自然不行了。这样:
    sprintf(sName,"\\\\\\\\.\\\\com%d",port);
      

  6.   

    CString sName;
    sName.Format("COM%d",port);
    hcom=CreateFile("\\\\.\\"+sName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH,NULL);这样就可以了!
      

  7.   

    CString sName;
    sName.Format("\\\\.\\COM%d",port);
    LPCTSTR str = sName.GetBuffer(0);
    hcom=CreateFile(sName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH,NULL);
    ……
    sName.ReleaseBuffer();这样也行!
      

  8.   

    注意:如果将上面的
    hcom=CreateFile(sName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH,NULL);
    改为:
    hcom=CreateFile(str,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH,NULL);
    也行!是否会产生BUG,我要好好追查一下,如果着急,就用第一种方法吧!
      

  9.   

    第一种方法COM1--COM9可以.10以上还是不行.
      

  10.   

    CString sName;
    sName.Format("\\\\.\\COM%d",port);
    LPCSTR str = sName.GetBuffer(0);
    hcom=CreateFile(str ,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_WRITE_THROUGH,NULL);
    ……
    sName.ReleaseBuffer();
    能正常打开10以上的串口,我的机器上有3块MOXA卡,共26个串口,经实验均能正常打开并通信!
      

  11.   

    \\\\.\\COM%d 这个形式绝对可以.我所在的公司就有多串口卡产品.而我本人就负责多串口卡的驱动开发. 采用那个形式如果无法打开,估计是你自己的程序某处存在问题.\\\\.\\COM%d 是一个SymbolLinkName,这个是由Windows维护的, 不是驱动程序的问题.