CString csCommName = "\\\\.\\COM1";
m_file.Open(csCommName,CFile::modeReadWrite);//CFile m_file是成员变量
//打开串口以及通讯参数的设置都没有问题
m_file.Write(m_string,m_string.StringLength(m_string));
//写入COM1没问题
char InBuffer[1000];
UINT  nActual = 0;
nActual=m_file.Read(InBuffer, sizeof(InBuffer));
//读出时nActual总是零?????
我觉得是从串口读时出问题了,但不知为什么!

解决方案 »

  1.   

    操作串口最好使用CreateFile、WriteFile、ReadFile,DeviceIoControl等API函数!如:
    HANDLE hCom;
    hCom = CreateFile("COM1" , 0 , 0 , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
    这样就打开了串口COM1,hCom是它的句柄,之后就可以进行读写了:
    char buffer[10];
    DWORD dwTrueRead = 0;
    ReadFile(
      hCom,
      buffer , 
      10,
      &dwTrueRead,
      NULL
    );写与读类似!!
      

  2.   

    to ypos(叶开)
    串口已经设置好了,没有问题的。
      

  3.   

    to HongHuer(痛苦:我什么都不懂) 
    up者都有分的,这可是我的原则:-)
      

  4.   

    to  hdsunwind(太阳风) ( ) 信誉:100 
    如果使用你说的这些函数,那么怎么设置串口呢?我开始是这样设置的
    CFileException e;
    if(Myfile.Open(csCommName,CFile::modeReadWrite,&e)) //打开串口
    {
    ASSERT( SetupComm(Myfile.m_hFile, 20480, 4096) );
    ASSERT( PurgeComm(Myfile.m_hFile, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR) );
    DCB MyDCB;
    ASSERT( GetCommState(Myfile.m_hFile, &MyDCB) );
             MyDCB.BaudRate = CBR_9600;
    MyDCB.ByteSize = 8;
    MyDCB.Parity = NOPARITY;
    MyDCB.StopBits = ONESTOPBIT;
             ASSERT( SetCommState(Myfile.m_hFile, &MyDCB) );
    COMMTIMEOUTS timeouts;
    timeouts.ReadIntervalTimeout = 1;
    timeouts.ReadTotalTimeoutMultiplier = 0;
    timeouts.ReadTotalTimeoutConstant = 1;
    timeouts.WriteTotalTimeoutMultiplier = 100;
    timeouts.WriteTotalTimeoutConstant = 5000;
    ASSERT( SetCommTimeouts(Myfile.m_hFile, &timeouts) );
    }
    若是这样设置不合适,应该怎样呢?谢谢!
      

  5.   

    啊?到哪里找萧蜂啊?
    有现成的吗?发我一个
    [email protected]
      

  6.   

    http://www.gjwtech.com/  这上面有好多有关串口的资料。用串口调试助手进行调试。
    当初我也遇到过类似问题,当我换成COM4时(通过“猫”上网的串口)时,调试成功了(当时没用串口调试助手)。你最好用串口调试助手进行调试。
    还有为什么用ASSERT,用“Release”编译时,ASSERT里面的表达式还起作用吗
      

  7.   

    先把数据写入串口,如果直接读取,是从开始读,还是接着写完了数据的地方读取?如果是后者,应该怎样调整串口中数据的指针,使其指向开始?
    我的程序:
    写入
    WriteFile (hcom,// Port handle
               m_stringedit,// Pointer to the data to write 
    m_stringedit.StringLength(m_stringedit),  // Number of bytes to write
    &dwNumBytesWritten, // Pointer to the number of bytes  written
    NULL                // Must be NULL for Windows CE
    );
    读出:
    char Byte[1000];
    ReadFile (hcom, // Port handle
    Byte,  // Pointer to data to read
    dwNumBytesWritten,   // Number of bytes to read
    &dwNumByteRead,  // Pointer to number of bytes read
    NULL                  // Must be NULL for Windows CE
    );
    现在读完后dwNumByteRead总是零!
      

  8.   

    楼主从你的语言中我觉的你可能根本不了解串口,
    你的串口有没有开始接收数据啊(有没有别的数据在向串口传数据)
    如果你的串口上空空的什么也没有,你怎么读数据啊,当然都是0啊
    串口的DCB参数应该和单片机端的传口参数相同,单片机该了这些参数,PC上就要和他相同。
    你的意思是说数据写到串口,然后再像文件一样读出来吗?串口可没这种机制啊,他只是写到单片机,又不保存,你最多能读出缓冲区的一些内容。否则你要是想从单片机读出数据,不是就出现乱伦了吗?
      

  9.   

    to  AthlonxpX86(一滴水) ( ) 信誉:105 
    我对这方面是不太清楚,还请讲详细点:
    听上面的大师说用CreateFile、WriteFile、ReadFile这些函数,还看MSDN好像就是这样使用。是否应该写入缓存,再从缓存读?我没接触过这个。
      

  10.   

    to  fengge8ylf(第一次真正想有个女朋友) ( ) 信誉:
    这个网站不错。可是我找不到用直接用VC++访问串口的程序,好像都使用Active X
      

  11.   

    看来我猜的没错。我真的无言了这种东西只能意会不能言传,何况我的表达能力极差,我怎么才能将给你听呢?
    ReadFile也的有文件可读啊,你的串口文件是空的,能读出什么,当串口接收到数据放到缓冲区时,你才能用ReadFile读到数据,缓冲区种没有任何数据,你读什么,而且串口本身又不能保存你写入的文件,
      

  12.   

    to  AthlonxpX86(一滴水) ( ) 信誉:105  2003-03-01 21:29:00  得分:0 
     fengge8ylf(第一次真正想有个女朋友) ( ) 信誉:
    谢谢你,找了一篇,明天看,要熄灯了!住宿舍真讨厌。想熬夜都不行!
     
    我看MSDN上说的过程就是CreateFile-然后设置-然后ReadFile-然后WriteFile。没说怎么
    把数据放到缓冲区阿?
      

  13.   

    对不起,错位了:应该这样: 
    fengge8ylf(第一次真正想有个女朋友) ( ) 信誉:
    谢谢你,找了一篇,明天看,要熄灯了!住宿舍真讨厌。想熬夜都不行!
    to  AthlonxpX86(一滴水) ( ) 信誉:105  2003-03-01 21:29:00  得分:0 我看MSDN上说的过程就是CreateFile-然后设置-然后ReadFile-然后WriteFile。没说怎么
    把数据放到缓冲区阿?
      

  14.   

    忠告:请不要使用CFile类做打开串口的操作,否则折腾死你
          用异步通讯方式比较好
      

  15.   

    呵呵,又见 凉冰 MM------------
    一个很好的串口编程示例,没有使用ACTIVEX,完全是WIN32http://www.codeproject.com/useritems/chaiyasit_t.asp#creating
      

  16.   

    demetry(智者橡木→→→★★★东北同仁会★★★) ( ) 信誉:127 哇,全是英文的!!头大中……
    咬牙看了:-( ,不过还是谢谢你!
      

  17.   

    找到了,你看看。啸峰工作室http://www.gjwtech.com/serialcomm.htm
      

  18.   

    HongHuer(痛苦:我什么都不懂) ( ) 
    你跟 fengge8ylf(第一次真正想有个女朋友) 说的是同一个网站。
    这么好的东西怎么就我不知道啊?
    好东西大家分享:
    http://www.gjwtech.com
      

  19.   

    不用多线程,会出现许多非常麻烦的现象,可能会造成死机和无法解释的现象,造成别的程序停止工作,自己的程序停止响应,再来点别的什么,系统可能就崩溃了
    你只要把龚建伟老师的主页上这一页的代码研究透就可以了。
    http://www.gjwtech.com/scomm/sc2serialportclass.htm
    这一页的代码可以说是龚建伟老师主页上所有介绍串口编程文章的精华所在了,说夸张点他的所有串口编程文章都是在讲这段代码的原理,你可以下载下来直接用,看一下头文件,非常简单几个函数就高定了,你也可以看他的源代码,我基本看懂了,涉及的多线程技术比较多,但在windows下应该说是必需的。
      

  20.   

    我听我同事说,如果用COM1的话(或COM2)是要接线的,至于接什么线,怎样接,他也不知道(当然我更不知道)。当初,在公司做串口程序时,也读不出数据。当我回家,通过“猫”上网,然后往COM4进行读写,一切正常。
      

  21.   

    fengge8ylf(第一次真正想有个女朋友) ( ) 信誉:
    我用做好的串口线把COM1 和COM2连起来了,串口线没有问题,在别的程序上试过了,痛苦……
      

  22.   

    象操作文件一样操作串口,绝对可以的。用CFile进行简单的串口读写,应该可以的,你试一试
      

  23.   

    to fengge8ylf(第一次真正想有个女朋友) ( ) 信誉:
    我式过了,换成文件是完全可以,改成串口就不行了
      

  24.   

    根据大家给的文章,我这样修改了程序,但是还是不行,问题处在
    写数据WriteFile的地方,请帮忙!谢谢!打开串口:
    HANDLE m_hcom;
    m_hcom= CreateFile("COM1",// Specify port device
    GENERIC_READ | GENERIC_WRITE,// Specify mode that open device.
    0,       // the devide isn't shared.
    NULL,  // the object gets a default security.
    OPEN_EXISTING, // Specify which action to take on file. 
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
    NULL);  
    if (m_hcom == INVALID_HANDLE_VALUE)
      AfxMessageBox("hComm == INVALID_HANDLE_VALUE");设置串口:
    COMMTIMEOUTS m_CommTimeouts;
    m_CommTimeouts.ReadIntervalTimeout = 1000;
    m_CommTimeouts.ReadTotalTimeoutMultiplier = 1000;
    m_CommTimeouts.ReadTotalTimeoutConstant = 1000;
    m_CommTimeouts.WriteTotalTimeoutMultiplier = 1000;
    m_CommTimeouts.WriteTotalTimeoutConstant = 1000;
    if (SetCommTimeouts(m_hcom, &m_CommTimeouts))
    {    
    if (GetCommState(m_hcom, &m_dcb))
    {
    m_dcb.BaudRate=CBR_9600;
    m_dcb.ByteSize=8;
    m_dcb.StopBits=ONESTOPBIT;
    if (!SetCommState(m_hcom, &m_dcb))
    AfxMessageBox("SetCommState()");
    } else
    AfxMessageBox("GetCommState()");}
    else
    AfxMessageBox("SetCommTimeouts()");
      

  25.   

    向串口写数据:
    char m_szWriteBuffer[0x1000];
    OVERLAPPED m_ov;
    memset(m_szWriteBuffer, 0, sizeof(m_szWriteBuffer));
    strcpy(m_szWriteBuffer,m_string);
    m_ov.Offset = 0;
    m_ov.OffsetHigh = 0;
    BOOL bResult=TRUE;
    bResult = WriteFile(m_hcom, // Handle to COMM Port
    m_szWriteBuffer,// Pointer to message buffer in calling finction
    strlen((char*)m_szWriteBuffer), // Length of message to send
    &BytesSent, // Where to store the number of bytes sent
    &m_ov); // Overlapped structure
    if(!bResult)
    AfxMessageBox("WriteFile Failed");
    前面运行正确,为什么总是写数据失败?即显示WriteFile Failed?
      

  26.   

    你一定是抄了
    http://www.gjwtech.com/scomm/sc2serialportclass.htm
    这一页上的代码,
    如果返回错误,就说明是对的。因为他的代码用了多线程重叠IO,他主页上有这个解释,
    m_hcom= CreateFile("COM1",// Specify port device
    GENERIC_READ | GENERIC_WRITE,// Specify mode that open device.
    0,       // the devide isn't shared.
    NULL,  // the object gets a default security.
    OPEN_EXISTING, // Specify which action to take on file. 
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,//以重叠方式打开串口
    NULL); 
         用了重叠IO后,WriteFile不等执行完就返回一个错误,你需要加入等待串口事件的函数和同步对象等待的函数一判断串口的返回事件,然后处理这些事件。详细解释去龚建伟老师的主页找吧,我不能在这里给你讲课吧     如果你想简单了事就用我说的那个类就可以了,你也可以看他的代码,看完后你就知道怎么回事了     强烈建议转到VC/MFC硬件/系统版,我会把他整理成FAQ的
      

  27.   

    AthlonxpX86(一滴水) ( ) 信誉:105  2003-03-02 23:32:00  得分:0 
     
    我把FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED这一项去掉,就可以发送了,但是
    慢的很。VC/MFC硬件/系统版相似的问题有很多,不错。
    应你要求,过会就转帖
      

  28.   

    当然慢了,你关闭了重叠IO,那么WriteFile直到写完数据才返回,这期间WriteFile所在线程将被堵塞,而且你有没用多线程,所以你的界面可能会停止响应,重则是系统变的十分缓慢,甚至死机,你的编程方法不适应于多线程操作系统,用了重叠IO后就可以解决(但也要专门开一个线程),WriteFile一执行就会返回,然后你去等待串口事件,处理事件,虽然等待函数也使线程堵塞,但是他会占用很少的资源,我也说不好,反正最后涉及的问题可能非常多。如果你真的不想用重叠IO,我想你起码应该为WriteFile和ReadFile开一个单独的线程,然后把他放进去
      

  29.   

    AthlonxpX86(一滴水) ( ) 信誉:105 
    你说的"佩服外国人的编程风格"的那个程序,为什么输出都是乱吗?
    比如:我在CEdit1中输入222,com2口就显示"? ? ?"
      

  30.   

    fengge8ylf(第一次真正想有个女朋友) (
    收到你的信了,正在研究,谢谢先。
      

  31.   

    这个有不能怪人家的程序,人家只是传递数据,什么格式的由你自己定,你的222是数字222还是字符串"222"是数据那么他是什么类型的char 的是0XDE,int16 0X00DE int32 0X0000 00DE
    还是每位数据都是ASIIC码,还是UNICODE,还有许多问题,比如字符串数组没有初始化,然后就装字符串,这样你永远也装不进去只要你确认你的串口能发数据,那就是你的事,人家的代码只是按2进制发的给你说我也说不清楚,拿来我给你调,我要是调不过去,我装死去,从此不来CSDN了
      

  32.   

    现在把COM1和COM2用线连起来,若是只运行一个对话框,也就是收发都在这一个对话框中,是没有问题的(这也证明串口好用,线好用,程序也应该没问题)。但是:
    是要是运行两个对话框,一个打开COM1用来写数据,一个打开COM2用来读数据,就不行了。
    请大家谈谈这是为什么?为什么?
      

  33.   

    经过大家的热心帮忙,我现在的问题已经基本解决了。开始是选的函数不合适,多谢 hdsunwind(太阳风) ( ) 大师的及时指点,后来在WriteFile ,ReadFile上的参数设置出了些问题,以前没大接触过串口,多谢
     fengge8ylf(第一次真正想有个女朋友) ( ) 
     HongHuer(痛苦:我什么都不懂) ( ) 
     demetry(智者橡木) ( ) 信誉:132 
    给我找了很多技术资料,使我从中学了不少东西,其中
    http://www.gjwtech.com
    http://www.codeproject.com
    我觉得都不错,与我一样有着方面问题的朋友,可以去看看:-)
    最后,要谢谢
     AthlonxpX86(一滴水) ( )和默默关心我的大哥。
    虽然忙,还抽时间帮我调试代码,纠正错误。谢谢!现在结帖。再次感谢,祝愿CSDN上的所有朋友天天快乐!