我通过串口接收数据(线程), 数据传输速率为38400,而且数据量大,而且非常快,运行后报错,
错误好像是地址溢出,我不知错在哪里了,请前辈们帮看看,老板快逼死人了创建串口:
COMMTIMEOUTS CommTimeOuts;
DCB dcb;
m_hCom2=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL); //以异步方式打开COM2口
if(m_hCom2==INVALID_HANDLE_VALUE)
AfxMessageBox("打开COM1串口错误!");
SetCommMask (m_hCom2, EV_RXCHAR ) ; //添加或修改Windows所报告的事件列表
SetupComm (m_hCom2,1024,1024); // 初始化通讯设备参数
// 清除缓冲信息
PurgeComm (m_hCom2, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR) ;
// 对异步I/O进行设置
CommTimeOuts.ReadIntervalTimeout = MAXDWORD ; //接收两连续字节的最大时间间隔
CommTimeOuts.ReadTotalTimeoutMultiplier =0; //接收每字节的平均允许时间
CommTimeOuts.ReadTotalTimeoutConstant = 0 ; //接收时间常数
SetCommTimeouts (m_hCom2, &CommTimeOuts) ;
//获取并设置串口
GetCommState ( m_hCom2, &dcb) ;
dcb.BaudRate = 38400;
dcb.fParity = FALSE;
dcb.fNull = FALSE;
dcb.StopBits = ONESTOPBIT;
dcb.Parity = NOPARITY;
dcb.ByteSize = 8; SetCommState( m_hCom2, &dcb); 接收数据:
unsigned char recvbuffer[1000];//用于接收报文的空间
unsigned char readbuf[1000];
OVERLAPPED olRead;
DWORD nLength;
DWORD dwError;
COMSTAT ComStat;
DWORD dwEvtMask;
int j=-1;
memset(&ComStat,0,sizeof(COMSTAT));
memset(&olRead,0,sizeof(OVERLAPPED));
memset(recvbuffer,0,1000);
olRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
while(1)//等待接受消息
{
WaitCommEvent (m_hCom2,&dwEvtMask,NULL);
if (dwEvtMask&EV_RXCHAR ==EV_RXCHAR )
ClearCommError(m_hCom2,&dwError,&ComStat);
if(ComStat.cbInQue>0)
{ memset(readbuf,0,1000);
ReadFile(m_hCom2,readbuf,ComStat.cbInQue,&nLength,&olRead);
for(int i=0;i<ComStat.cbInQue;i++)
{ j=j+1;
if(readbuf[i]!=0x0a)
recvbuffer[j]=readbuf[i];
else
{
recvbuffer[j]=readbuf[i];
if(recvbuffer[0]=='a' && recvbuffer[1]=='b' && recvbuffer[2]=='c' && recvbuffer[3]=='d')
{
my_program(); //处理函数
::SendMessage(...);//发送消息 memset(recvbuffer,0,1000);
j=-1;
}
else
{
memset(recvbuffer,0,1000);
j=-1;
}
}
}
} }
错误好像是地址溢出,我不知错在哪里了,请前辈们帮看看,老板快逼死人了创建串口:
COMMTIMEOUTS CommTimeOuts;
DCB dcb;
m_hCom2=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL); //以异步方式打开COM2口
if(m_hCom2==INVALID_HANDLE_VALUE)
AfxMessageBox("打开COM1串口错误!");
SetCommMask (m_hCom2, EV_RXCHAR ) ; //添加或修改Windows所报告的事件列表
SetupComm (m_hCom2,1024,1024); // 初始化通讯设备参数
// 清除缓冲信息
PurgeComm (m_hCom2, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR) ;
// 对异步I/O进行设置
CommTimeOuts.ReadIntervalTimeout = MAXDWORD ; //接收两连续字节的最大时间间隔
CommTimeOuts.ReadTotalTimeoutMultiplier =0; //接收每字节的平均允许时间
CommTimeOuts.ReadTotalTimeoutConstant = 0 ; //接收时间常数
SetCommTimeouts (m_hCom2, &CommTimeOuts) ;
//获取并设置串口
GetCommState ( m_hCom2, &dcb) ;
dcb.BaudRate = 38400;
dcb.fParity = FALSE;
dcb.fNull = FALSE;
dcb.StopBits = ONESTOPBIT;
dcb.Parity = NOPARITY;
dcb.ByteSize = 8; SetCommState( m_hCom2, &dcb); 接收数据:
unsigned char recvbuffer[1000];//用于接收报文的空间
unsigned char readbuf[1000];
OVERLAPPED olRead;
DWORD nLength;
DWORD dwError;
COMSTAT ComStat;
DWORD dwEvtMask;
int j=-1;
memset(&ComStat,0,sizeof(COMSTAT));
memset(&olRead,0,sizeof(OVERLAPPED));
memset(recvbuffer,0,1000);
olRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
while(1)//等待接受消息
{
WaitCommEvent (m_hCom2,&dwEvtMask,NULL);
if (dwEvtMask&EV_RXCHAR ==EV_RXCHAR )
ClearCommError(m_hCom2,&dwError,&ComStat);
if(ComStat.cbInQue>0)
{ memset(readbuf,0,1000);
ReadFile(m_hCom2,readbuf,ComStat.cbInQue,&nLength,&olRead);
for(int i=0;i<ComStat.cbInQue;i++)
{ j=j+1;
if(readbuf[i]!=0x0a)
recvbuffer[j]=readbuf[i];
else
{
recvbuffer[j]=readbuf[i];
if(recvbuffer[0]=='a' && recvbuffer[1]=='b' && recvbuffer[2]=='c' && recvbuffer[3]=='d')
{
my_program(); //处理函数
::SendMessage(...);//发送消息 memset(recvbuffer,0,1000);
j=-1;
}
else
{
memset(recvbuffer,0,1000);
j=-1;
}
}
}
} }
m_hCom2=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL);既然制定了这个标志,最后一个参数就不能为空,把这个标志写成0试试看
由于数据量大而且非常快 我怀疑是不是串口接收缓冲区溢出了郁闷 ,不知哪里有问题,如何改
而此时读操作还未完成,你操作缓存数组就可能出问题
bool bResult = ReadFile(m_hCom2,readbuf,ComStat.cbInQue,&nLength,&olRead);if(!bResult ) //如果ReadFile函数返回FALSE{ if(GetLastError()==ERROR_IO_PENDING) //GetLastError()函数返回ERROR_IO_PENDING,表明串口正在进行读操作 { WaitForSingleObject(olRead.hEvent,2000); //使用WaitForSingleObject函数等待,直到读操作完成或延时已达到2秒钟 //当串口读操作进行完毕后,olRead的hEvent事件会变为有信号,此时再读你的接收缓冲数组的内容 ...... } return 0;}