首先说明下我改动的我用/* modified by Andrew 2014/04/07 */注释了,楼主可以和自己的代码比较下,看看我改动了哪些,如果觉得我改动的有什么问题,我们可以再共同探讨;
第一个:CreateFile()函数的 文件的属性参数我改了。
第二个:SetupComm()和PurgeComm()我又使用了,后一个不用行不行你可以自己试验下,我没有实验
第三个:对nwrite进行了简单的循环,计算实际写入串口的字节数
第四个:将SetFilePointer()注释掉了,我调试过,基本0影响,如果要是不确定要读多少字节的话,不妨把接收的空间申请大一些
第五个:buffRead=(char *)malloc(1024);只要注意一点就可以了:实际申请的空间要比理论上至少多上3个字节的空间。这里1024是我自己写的,你可以自己设置。
第六个:ReadFile(hCom,buffRead,nwrite,&dwBytesRead,NULL)这里我将nread改成了nwrite就是将我写的数据都读出来(调试简单),你可以自己根据需要读取数据的大小自行填充
第七个:就是最后两个free内存释放函数,我估计你开始那个两三次以后出现的以外退出就是因为malloc和free操作不当引起的。
最后还有点就是:最好不要使用goto语句,据说会带来编程的混乱。你可以在一个while(1)循环里进行对串口的操作。
基本没打乱你的代码结构,最后主函数不要这么藏,可以讲这个拆成各个子函数,条理会清楚些
你在看看还有没有什么问题,我用VC6.0调试的没有什么问题,也没有意外退出:
程序代码:
[ 本帖最后由 Andrew_Lee 于 2014-4-7 20:29 编辑 ]
	
	
	      第一个:CreateFile()函数的 文件的属性参数我改了。
第二个:SetupComm()和PurgeComm()我又使用了,后一个不用行不行你可以自己试验下,我没有实验
第三个:对nwrite进行了简单的循环,计算实际写入串口的字节数
第四个:将SetFilePointer()注释掉了,我调试过,基本0影响,如果要是不确定要读多少字节的话,不妨把接收的空间申请大一些
第五个:buffRead=(char *)malloc(1024);只要注意一点就可以了:实际申请的空间要比理论上至少多上3个字节的空间。这里1024是我自己写的,你可以自己设置。
第六个:ReadFile(hCom,buffRead,nwrite,&dwBytesRead,NULL)这里我将nread改成了nwrite就是将我写的数据都读出来(调试简单),你可以自己根据需要读取数据的大小自行填充
第七个:就是最后两个free内存释放函数,我估计你开始那个两三次以后出现的以外退出就是因为malloc和free操作不当引起的。
最后还有点就是:最好不要使用goto语句,据说会带来编程的混乱。你可以在一个while(1)循环里进行对串口的操作。
基本没打乱你的代码结构,最后主函数不要这么藏,可以讲这个拆成各个子函数,条理会清楚些
你在看看还有没有什么问题,我用VC6.0调试的没有什么问题,也没有意外退出:
程序代码:#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <commdlg.h>
#include <windef.h>
#define BAUD_RATE 9600
#define p printf
#define size 1024
int nread,nwrite;
void main()
{
    int temp;
    HANDLE hCom;
    COMMTIMEOUTS timeouts;
    COMMCONFIG dcb;
    char *buffRead;
    char *buffWrite;
    DWORD dwBytesWritten,dwBytesRead;
  
    retry:
    /*  把串口作为文件打开  */
    hCom=CreateFile("COM4",                       //打开串口1
                GENERIC_READ|GENERIC_WRITE,       //允许读写
                0,                                //通讯设备必须以独占方式打开
                NULL,                             //安全属性
                OPEN_EXISTING,                    //通讯设备已存在
                /*FILE_FLAG_OVERLAPPED*/0,             //异步I/O        /* modified by Andrew 2014/04/07 */                                       
                NULL);  
    if(hCom==(HANDLE)-1)                          //打开串口失败返回
    {
        if(GetLastError()==ERROR_FILE_NOT_FOUND)
        {
            p("serial port does exist.\n");
        }
        p("some other error occured, Inform user.\n");
    }
    else
        p("port open successed!\n");
    /*  串口超时结构体设置  */
    SetCommTimeouts(hCom,&timeouts);
    //COMMTIMEOUTS timeouts={0};
 
    timeouts.ReadIntervalTimeout=1000;            //接收时两字符之间的最大时延
    timeouts.ReadTotalTimeoutMultiplier=500;      //指定以毫秒为单位的累积值,用于计算读操作时的超时总数
    timeouts.ReadTotalTimeoutConstant=5000;       //指定以毫秒为单位的常数,用于计算读操作时的超时总数
    timeouts.WriteTotalTimeoutMultiplier=500;     //计算写操作时的超时总数
    timeouts.WriteTotalTimeoutConstant=2000;       //计算写操作时的超时总数
    
    if(!SetCommTimeouts(hCom,&timeouts))          //与串口绑定失败返回
    {
        p("error setting port state.\n");
    }
  
    /* 设置串口各项参数  */
    if(!GetCommState(hCom,&dcb.dcb))
    {
    p("error setting serial port state.\n");  //串口绑定失败
    }
    dcb.dcb.BaudRate=BAUD_RATE;     //波特率为9600
    dcb.dcb.ByteSize=8;             //设置数据位
    dcb.dcb.Parity=EVENPARITY;      //偶校验
    dcb.dcb.StopBits=2;             //两个停止位
    dcb.dcb.fBinary=TRUE;
    dcb.dcb.fParity=TRUE;
    if(!SetCommState(hCom,&dcb.dcb))                  //DCB绑定失败返回
    {
        p("串口设置出错!");
    }
   /*  设置串口输入输出缓冲区  */
    if(!SetupComm(hCom,1024,1024))                //设置串口的输入/输出缓冲区大小
    {
    p("设置串口读写缓冲区失败");
    }
    PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);  //终止所有的后台读写操作并清空缓冲区 
    /*  将数据写入缓冲区操作  */
    buffWrite=(char *)malloc(size);             //输入缓冲区分配
        p("please input yourdata:");
    scanf("%s",buffWrite);
    //nwrite=255; 
    /*modified by Andrew 2014/04/07*/
    nwrite = 0;
    for(temp = 0;buffWrite[temp]!='\0';temp++)
    {
        nwrite++;
    }
    /* Anrew modified over*/
    if(!WriteFile(hCom,buffWrite,nwrite,&dwBytesWritten,NULL))
    {
        p("error writting to output buffer.\n");
    }
    else
        p("written data:%s\n",buffWrite);
        system("pause");                       //调用系统命令pause,输出类似于“press any key to exit”的字
    /*  从输出缓冲区读取数据操作  */
    // buffRead=0;
    /* delete by Andrew 2014/04/07*/
       //buffRead=(char *)malloc(size);
    /*  在缓冲区设置当前的读写位置  */
    /*     SetFilePointer(hCom,                 //问价句柄
             0,                               //偏移量(低位)
             0,                               //偏移量(高位)
             FILE_BEGIN);                     //基准位置
     nread=GetFileSize(hCom,NULL);
    */
    /*  Andrew delete over */
     buffRead=(char *)malloc(1024);
     memset(buffRead,0,1024);                 //将缓冲区的前1024个字节用0代替,相当于初始化
     if(!ReadFile(hCom,buffRead,nwrite,&dwBytesRead,NULL))                 /*modified by Andrew 2014/04/07*/
     {
     p("error reading from input buffer.\n");
     }
     else
     {
         p("Data read from read buffer is:%s\n",buffRead);
     }
    /*  关闭串口  */
  CloseHandle(hCom);       //关闭设备句柄
       
/*modified by Andrew 2014/04/07 */
         free(buffWrite);
         free(buffRead);
/* Andrew modified over */ 
         Sleep(2000);
         goto retry;
  }[ 本帖最后由 Andrew_Lee 于 2014-4-7 20:29 编辑 ]



											


	    

	