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








