首先说明下我改动的我用/* 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 编辑 ]