偶然会有接收不到数据的情况。read这个函数会返回0 //printf("\n没有获取到0x02开头的数据\n"出错)
偶尔会有接收不到数据的情况。read这个函数会返回0 //printf("\n没有获取到0x02开头的数据\n"出错);
- C/C++ code
BYTE recv_msg(int g_CommType, long g_hComm, BYTE *msg, DWORD *RxLen, int time_out,BYTE *cmd) { BYTE buf[1024*8]; DWORD iLen; WORD crc; WORD crc_t; BYTE socrc[2]; BYTE poscrc[2]; fd_set recv_mask; struct timeval timeout; int ret; int sock; int flags; int j; memset(buf,0,sizeof(buf)); static int tmsscn =0; //0x01 Modem(拨号) sock = g_hComm; *RxLen = 0; while(1) { FD_ZERO(&recv_mask); FD_SET(sock, &recv_mask); timeout.tv_sec = time_out; //设置超时s timeout.tv_usec = 0; ret = select(sock+1, &recv_mask, NULL, NULL, &timeout); if (ret < 0) //出错 { printf("ret=%d",ret); printf("\n\n"); return -1; //未知错误 } if (ret == 0) //如果超时,再读一次 { sock = g_hComm; FD_ZERO(&recv_mask); FD_SET(sock, &recv_mask); timeout.tv_sec = time_out; //设置超时s timeout.tv_usec = 0; ret = select(sock+1, &recv_mask, NULL, NULL, &timeout); while(ret <=0) { sock = g_hComm; FD_ZERO(&recv_mask); FD_SET(sock, &recv_mask); timeout.tv_sec = time_out; //设置超时s timeout.tv_usec = 0; ret = select(sock+1, &recv_mask, NULL, NULL, &timeout); } } else { if (FD_ISSET(sock, &recv_mask)) //接收 { /* 读取第一个STX标志 */ do { memset(buf, 0, sizeof(buf)); ret = read(sock, buf, 1); printf("buf[0]=%02x\t",buf[0]); if (ret != 1) { memset(buf, 0, sizeof(buf)); ret = read(sock, buf, 1); printf("\nret=%d\n",ret); //printf("\n没有获取到0x02开头的数据\n"); //printf("ERR_NO_STX"); //return ERR_NO_STX; } } while(buf[0] != STX); /* 读取一个字节命令码 */ ret = read(sock, &buf[1], 1); printf("buf[1]=%02x",buf[1]); if((buf[1]< HNAD)||(buf[1]> OVER)) { printf("\n命令字错误\n"); return ERR_CMD; } *cmd = buf[1]; /* 读取两个字节的返回码 */ ret = read(sock, &buf[2], 2); if(buf[2] != 0x00) { return ERR_CMD; } /* 读2个字节的数据报文长度 */ ret = read(sock, &buf[4], 2); if (ret == 0) //正常关闭 { return 0; } else if (ret < 0) //socket关闭或链接断了 { return 0; } else if (ret != 2) { return 0; } iLen = buf[6]*256 + buf[15]; ret = read(sock, &buf[HEAD_SIZE], iLen+2); //读取数据长度+LRC(2) if (ret == 0) //正常关闭 { return 0; } else if (ret < 0) //socket关闭或链接断了 { return 0; } else if (ret != iLen+2) { return 0; } KKK = KVC16((BYTE*)&buf[0], iLen+HEAD_SIZE,0); VCT(crc,socrc); crc_t = PPT(&buf[HEAD_SIZE+iLen]); VCD(crc_t,poscrc); if (crc != crc_t) { return ERR_LRC; } *RxLen = iLen; return 1; } } } }