我的程序如下,每次都是读个几次返回的数据长度就不对了,把读去时间改为200MS读一次,基本3次就挂了,长度就不对,然后后面返回的多时0了,如果改为2000MS,则可能读的可以长时间一点,但也不会超过20秒,请大家帮我看看问题可能出在哪了,谢谢。
BOOL CConnectPort::OnSend128(unsigned char command, int date, DWORD ms)
{
// unsigned short data_low,data_high;
// unsigned short data_sum;
//禁止用130了
// SEND130_ENABLE=0;
// if(COM3BUSY==FALSE && SEND128_ENABLE==1 && COM3BUSY_128==FALSE) //先判断串口是否空闲
{
/***/
// COM3BUSY=TRUE; //占用串口
/***/
/***/
// COM3BUSY_128=TRUE; //已经在执行任务
/***/ //发命令
DWORD dwactlen=0;
DWORD dwLength=0;
DWORD i;
int len; //要发送的字符长度
//DWORD datalen; //接收到的数据长度
len=1;
//datalen=0;
unsigned char *psendbuf=new unsigned char[len];
unsigned char *recvBuf=new unsigned char[date];
//unsigned char data[202];
psendbuf[0]=command;
PurgeComm(hComm,PURGE_TXCLEAR|PURGE_RXCLEAR); //清除收/发缓冲区
WriteFile(hComm,psendbuf,len,&dwactlen,NULL);
if(dwactlen==0)
{
AfxMessageBox(_T("128写入数据不成功!"));
delete[] psendbuf;
delete[] recvBuf;
return FALSE; //接收失败
}
//Sleep(ms); //ReadTotalTimeoutMultiplier=20;有读超时设置,所以不用这里延时了
//等待应答
//接收命令应答(协议规定:命令可以重发;数据不能重发)
ReadFile(hComm,recvBuf,date,&dwLength,NULL); //其实我们接收到的命令应答只是一个字节
if(dwLength==date) //每次都是这里出问题
{
//AfxMessageBox(_T("128数据接收成功!"));
}
else
{
if(dwLength==0){AfxMessageBox(_T("4354!"));}
AfxMessageBox(_T("128err1,USB通信中断Comm,请检查设备电源是否已连接或USB松动!")); delete[] psendbuf;
delete[] recvBuf;
return FALSE; //接收失败
}
if((recvBuf[0]==0x00)&&(recvBuf[date-1]==0xff))
{
//AfxMessageBox(_T("ADC数据正确!"));
delete[] psendbuf;
delete[] recvBuf;
return TRUE; //ADC数据正确,返回真值
}
else
{
delete[] psendbuf;
delete[] recvBuf; return FALSE; //接收失败
}
}}发送方式是OnSend128(128,50,50);波特率是115200,返回50个数据,读的快的时候,dwLength都是正确的50,但第三次的时候就会变成5,然后后面就是0了,谢谢了。
BOOL CConnectPort::OnSend128(unsigned char command, int date, DWORD ms)
{
// unsigned short data_low,data_high;
// unsigned short data_sum;
//禁止用130了
// SEND130_ENABLE=0;
// if(COM3BUSY==FALSE && SEND128_ENABLE==1 && COM3BUSY_128==FALSE) //先判断串口是否空闲
{
/***/
// COM3BUSY=TRUE; //占用串口
/***/
/***/
// COM3BUSY_128=TRUE; //已经在执行任务
/***/ //发命令
DWORD dwactlen=0;
DWORD dwLength=0;
DWORD i;
int len; //要发送的字符长度
//DWORD datalen; //接收到的数据长度
len=1;
//datalen=0;
unsigned char *psendbuf=new unsigned char[len];
unsigned char *recvBuf=new unsigned char[date];
//unsigned char data[202];
psendbuf[0]=command;
PurgeComm(hComm,PURGE_TXCLEAR|PURGE_RXCLEAR); //清除收/发缓冲区
WriteFile(hComm,psendbuf,len,&dwactlen,NULL);
if(dwactlen==0)
{
AfxMessageBox(_T("128写入数据不成功!"));
delete[] psendbuf;
delete[] recvBuf;
return FALSE; //接收失败
}
//Sleep(ms); //ReadTotalTimeoutMultiplier=20;有读超时设置,所以不用这里延时了
//等待应答
//接收命令应答(协议规定:命令可以重发;数据不能重发)
ReadFile(hComm,recvBuf,date,&dwLength,NULL); //其实我们接收到的命令应答只是一个字节
if(dwLength==date) //每次都是这里出问题
{
//AfxMessageBox(_T("128数据接收成功!"));
}
else
{
if(dwLength==0){AfxMessageBox(_T("4354!"));}
AfxMessageBox(_T("128err1,USB通信中断Comm,请检查设备电源是否已连接或USB松动!")); delete[] psendbuf;
delete[] recvBuf;
return FALSE; //接收失败
}
if((recvBuf[0]==0x00)&&(recvBuf[date-1]==0xff))
{
//AfxMessageBox(_T("ADC数据正确!"));
delete[] psendbuf;
delete[] recvBuf;
return TRUE; //ADC数据正确,返回真值
}
else
{
delete[] psendbuf;
delete[] recvBuf; return FALSE; //接收失败
}
}}发送方式是OnSend128(128,50,50);波特率是115200,返回50个数据,读的快的时候,dwLength都是正确的50,但第三次的时候就会变成5,然后后面就是0了,谢谢了。
解决方案 »
- 枚举USB设备时发现一个奇怪的现象,请大侠解释一下
- CImage&平移
- 寻书:Microsoft INTERNET EXPLORER 5程序设计
- 请分析一段代码关于发送短消息的
- 请喜欢 数据结构和算法的朋友 加入这个群 "数据结构与算法",群号7835458
- 怎么定义二进制数据?
- 我将一个VC+ACCESS改为VC+SQL后,ACCESS下正常,在SQL下当执行到PutAbsolutePage((PositionEnum)m_CurPage)时就出错,错误为
- 基础
- vc++6.0控制台程序调用dll出错
- 菜鸟求助小问题!
- CFile类的read函数的用法
- VC++如何实现像手机安卓系统那些可以上下滚动对话框,对话框不带滚动条
// 可以把字节间超时设置的大一点,防止两个字节之间的间隔太大。
{
DCB dcb;
COMMTIMEOUTS CommTimeOuts;
CString Port_COM;
Port_COM = "\\\\.\\";
Port_COM+=Port; //="\\\\.\\"+Port;
//打开串口
m_hComm=CreateFile(Port_COM,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
if(m_hComm==INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("无法打开端口或端口已经打开!请检查USB是否连接! "));
return FALSE;
}
GetCommState(m_hComm,&dcb);
dcb.BaudRate=BaudRate;
dcb.ByteSize=DataBits;
dcb.Parity=Parity;
dcb.StopBits=StopBits;
dcb.fParity=FALSE;
dcb.fBinary=TRUE;
dcb.fDtrControl=0;
dcb.fRtsControl=0;
dcb.fOutX=0;
dcb.fInX=0;
dcb.fTXContinueOnXoff=0;
dcb.fAbortOnError=true; //fAbortOnError true 串口错误时,终止串口读写 //设置状态参数
SetCommMask(m_hComm,EV_RXCHAR); //串口事件:接收到一个字符
SetupComm(m_hComm,200,200); //设置接收与发送的缓冲区大小
if(!SetCommState(m_hComm,&dcb)) //设置串口的DCB
{
AfxMessageBox(_T("无法按当前参数配置端口,请检查参数!"));
ClosePort(m_hComm);
return FALSE;
} //设置超时参数
/* GetCommTimeouts(m_hComm,&CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout=100; //接收字符间最大时间间隔;原值100
CommTimeOuts.ReadTotalTimeoutMultiplier=100;
CommTimeOuts.ReadTotalTimeoutConstant=100; //读数据总超时常量;原值100
CommTimeOuts.WriteTotalTimeoutMultiplier=30; //也要设置,要不会出现写不成功而卡住的可能
CommTimeOuts.WriteTotalTimeoutConstant=100;*/ GetCommTimeouts(m_hComm,&CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout=10; //接收字符间最大时间间隔;原值100
CommTimeOuts.ReadTotalTimeoutMultiplier=10;
CommTimeOuts.ReadTotalTimeoutConstant=10; //读数据总超时常量;原值100
CommTimeOuts.WriteTotalTimeoutMultiplier=3;
CommTimeOuts.WriteTotalTimeoutConstant=50; if(!SetCommTimeouts(m_hComm,&CommTimeOuts))
{
AfxMessageBox(_T("无法设置超时参数!"));
ClosePort(m_hComm);
return FALSE; }
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR); //清除收/发缓冲区 /*test*/
//ClosePort(m_hComm);
/*test*/ return TRUE;
}BOOL ClosePort(HANDLE m_hComm)
{
if(m_hComm!=INVALID_HANDLE_VALUE)
{
SetCommMask(m_hComm,0);
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR); //清除收/发缓冲区
//CloseHandle(m_hComm);
if(!CloseHandle(m_hComm)) AfxMessageBox("关闭串口失败!");
m_hComm=INVALID_HANDLE_VALUE;
return TRUE;
} return FALSE;
}