我在win2000上运行我的可执行代码,其中串口通信通过下面方式建立的:
m_hCom=CreateFile(m_sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FLAG_OVERLAPPED,  NULL); if(m_hCom==INVALID_HANDLE_VALUE) return FALSE;
SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);
PurgeComm(m_hCom, PURGE_RXCLEAR | PURGE_RXCLEAR);
SetCommMask(m_hCom, EV_RXCHAR);
当我打开过超级终端进行读取数据后,串口的发送数据就不正常,无法将数据传送出去!发送函数如下:
DWORD CStbDoc::WriteComm(char *buf, DWORD dwLength)
{
BOOL fState;
DWORD length=dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags; ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
fState=WriteFile(m_hCom,buf,length,&length,&m_osWrite); if(!fState)
{ if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(m_hCom,&m_osWrite,&length,TRUE);// µÈ´ý
}
else
length=0;
} return length;
}可否有人指点一下这是为什么?怎么解决?多些!在线等待!

解决方案 »

  1.   

    两串口的波特率是否一致?必须一致.
    WriteFile(m_hCom,buf,length,&length,NULL); //试一试
      

  2.   

    你用的是异步通讯,发数据的函数应该没错,可能是和超级终端有冲突。
    比如说超级终端打开了一个串口,你的程序再打开的话就会失败。那串口的发送数据就不正常,你可以跟踪看一下m_hCom还有效没!
      

  3.   


    DWORD CStbDoc::WriteComm(char *buf, DWORD dwLength)
    {
    BOOL fState;
    DWORD length=dwLength;
    fState=WriteFile(m_hCom,buf,length,&length,&m_osWrite); if(!fState)
    { if(GetLastError()==ERROR_IO_PENDING)
    {
    GetOverlappedResult(m_hCom,&m_osWrite,&length,false);// µÈ´ý
    }
    else
    length=0;
    }
    SetCommMask(m_hCom,EV_RXCHAR);
    return length;
    }
    这样写试试,应该没什么问题。
      

  4.   

    比较奇怪,我用的好好的。测试过的!你确定m_hCom是有效的吧!
      

  5.   

    接受数据就可以,就是发送出错。
    应该说我用两台机器通讯,他发给我得我可以收到,但是我回复的就不可以。这样子是不是m_hCom是有效的吧!
      

  6.   

    巧的是我也是两台机子测的程序。奇怪。你在发送时m_hCom不为空吧!
      

  7.   

    其实这种现象不是每台机器都有的。有的机器就没有问题。有的就不行。装有win98的就怎样都可以。winxp的只要开过超级终端就不好用,接收发送都不行。必须重新开机。win2000则是部分好用,部分不好用。IBM笔记本是都不好用。奇怪吧!我是一点点办法都没有!郁闷!
      

  8.   

    我觉得有点问题,你这个函数的调用频率很高吧.如果很高可能会出现问题的.
    if(GetLastError()==ERROR_IO_PENDING)
    {
    GetOverlappedResult(m_hCom,&m_osWrite,&length,false);//一次GetOverlappedResult的调用不能保证数据写完成了,这个函数只查询IO结果.如果你调用你的WriteComm函数的频率高,很可能会使系统IO队列或缓冲溢出.
    }
    一般情况下是这样写的.
    if(GetLastError()==ERROR_IO_PENDING)
    {
              while(!GetOverlappedResult(m_hCom,&m_osWrite,&length,false)
             {
                dwerror = GetLastError();
                if(dwError = ERPOR_IO_INCOMPLETE)
                     countinue;
                else
                {
                 CkearCinnError(...........);
                 ..................
                 break;
                 }
             }
    }
    但是我个人认为用同步方试可能更有效一些,特别是数据量大的时候,因为里面的while循环可能会降低效率.
      

  9.   

    问题还是没有得到解决,不知道有没有人有更好的建议!
    我本身的设置就是GetOverlappedResult(m_hCom,&m_osWrite,&length,true);这样还会有关系吗?
      

  10.   

    我用的是win2000,writefile是这样写的:
    for(int i = 0; i < m_szWriteBuffer.GetLength (); i++)
    {
    bResult = WriteFile(hCom,
    (LPSTR)m_szWriteBuffer[i],
    1,
    &BytesSent,
    &m_ov);
    }
    也不好用,是不是哪里错了????
      

  11.   

    我也碰到类似的问题,win2k系统,有个vb的读卡程序运行过后就无法正常工作,查看他们的dcb结构设置是一样的,
    更搞笑的是 WriteFile()函数返回1,等于成功,但实际上确什么都没读到,
    参数绝对没问题,只要不开那个vb的读卡程序就完全正常。
      

  12.   

    就是com属性中的数据位啊,都是一样的么,我以前发现串口调试助手中和windows中的默认设置不一样的,前者是7为,后者是8位
      

  13.   

    我觉的是这样,在打开串口后,更改了串口的某些默认设置,那样需要在进入后做好设置setting,否则就按默认的设置,可能出错!
      

  14.   

    这个问题肯定是出在硬件流设置,就是对DCB结构的填写有问题。DCB dcb;
    好像是 dcb.xoff = TRUE; dcb.yoff = TRUE;具体你在查一下就好了