首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

ReadFile读去串口数据一快就出有关问题,请问

2012-07-05 
ReadFile读去串口数据一快就出问题,请教我的程序如下,每次都是读个几次返回的数据长度就不对了,把读去时间

ReadFile读去串口数据一快就出问题,请教
我的程序如下,每次都是读个几次返回的数据长度就不对了,把读去时间改为200MS读一次,基本3次就挂了,长度就不对,然后后面返回的多时0了,如果改为2000MS,则可能读的可以长时间一点,但也不会超过20秒,请大家帮我看看问题可能出在哪了,谢谢。

C/C++ code
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)  [color=#FF0000]//每次都是这里出问题[/color]        {            //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不了解你程序运行流程,2不知道你读取的数据流的形式

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


[解决办法]
上位机发送数据频率太快有可能会发生这种情况,你试试发慢点,比如用串口调试程序的定时器发,先1000ms发一次,看看有无丢帧.
[解决办法]
// USB转的串口?是不能太快
// 可以把字节间超时设置的大一点,防止两个字节之间的间隔太大。

热点排行