我的程序如下,每次都是读个几次返回的数据长度就不对了,把读去时间改为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了,谢谢了。

解决方案 »

  1.   

    1不了解你程序运行流程,2不知道你读取的数据流的形式似乎你COMMTIMEOUTS参数设置还是有问题,ReadTotalTimeoutMultiplier只是读串口的时间系数,需要乘你读缓冲区字节加上读串口常数之后是总的读超时。如果读操作大于超时,函数将返回,而一旦返回似乎你程序就结束了。权益之计是如果你发送指令后一直需要接数据,就将总超时设为最大。看起来程序结构和COMMTIMEOUTS读写参数设置都需要改进。如有必要需要引入单独的串口接收线程。
      

  2.   

    // USB转的串口?是不能太快
    // 可以把字节间超时设置的大一点,防止两个字节之间的间隔太大。
      

  3.   

    我开串口的方法是BOOL OpenPort(LPCTSTR Port,int BaudRate,int DataBits,int StopBits,int Parity)
    {
    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;
    }
      

  4.   

    最后发现是ARM9有点问题,谢谢各位