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转的串口?是不能太快
// 可以把字节间超时设置的大一点,防止两个字节之间的间隔太大。