Hello guys
I'm having difficulty in a routine that will receive data via Socket and Send to a CAN interface.
My routine identifies a Bytes sequence, separates 13 bytes and processes, however some part of the code causes it to sometimes process the same buffer twice, I could not identify where ...
Code://Receive a message from client while( (readSize = recv(sock , mensagemRecebida , TAM_BUFFER_RX_SOCKET , 0)) > 0 ) { for(contador=0; contador<readSize; contador++) args.arg1Dados[contador] = mensagemRecebida[contador]; args.arg2readSize = readSize; if(pthread_create( &thread_Processar , NULL , &ProcessarDadosRecebidos , (void *)&args) < 0) { perror("could not create thread"); return 1; } //clear the message buffer memset(mensagemRecebida, 0, TAM_BUFFER_RX_SOCKET); }Test Send Data (Last byte is Sequential)Code:struct arg_struct { unsigned char arg1Dados[TAM_BUFFER_RX_SOCKET]; int arg2readSize; }; void *ProcessarDadosRecebidos(void *arguments) { int idxNovoPacote=0; int idxPosicaoInicioCAN = 0; int idxPosicaoCharPacoteLido=0; int ID_DESTINO_BT1 = 0; int ID_DESTINO_BT2 = 0; int DATASIZE = 0; int ID_ORIGEM = 0; int IDX_DEVICE = 0; int IDX_FUNCAO_DEVICE = 0; struct arg_struct *args = arguments; unsigned char mensagemCANSeparada [DEFAULT_PACKET_CAN_SIZE]; for(idxPosicaoCharPacoteLido=0; idxPosicaoCharPacoteLido<args->arg2readSize; idxPosicaoCharPacoteLido++) { if (idxPosicaoCharPacoteLido + 7 < args->arg2readSize) { ID_DESTINO_BT1 = idxPosicaoCharPacoteLido; ID_DESTINO_BT2 = idxPosicaoCharPacoteLido + 1; DATASIZE = idxPosicaoCharPacoteLido + 4; ID_ORIGEM = idxPosicaoCharPacoteLido + 5; IDX_DEVICE = idxPosicaoCharPacoteLido + 6; IDX_FUNCAO_DEVICE = idxPosicaoCharPacoteLido + 7; if (args->arg1Dados[ID_DESTINO_BT1] == 0) { if (args->arg1Dados[ID_DESTINO_BT2] == 0) { if (args->arg1Dados[DATASIZE] == 8) { if (args->arg1Dados[ID_ORIGEM] == 0) { if (args->arg1Dados[IDX_DEVICE] > 0) { if (args->arg1Dados[IDX_FUNCAO_DEVICE] > 0) { idxPosicaoInicioCAN = idxPosicaoCharPacoteLido; printf("Packet SEQ: %d Start Idx Of Packet %d Total Size: %d", contadorDebug, idxPosicaoInicioCAN, args->arg2readSize); for(idxNovoPacote=0; idxNovoPacote<DEFAULT_PACKET_CAN_SIZE && idxNovoPacote<args->arg2readSize; idxNovoPacote++) { if(idxPosicaoInicioCAN < args->arg2readSize) { mensagemCANSeparada[idxNovoPacote] = args->arg1Dados[idxPosicaoInicioCAN]; idxPosicaoInicioCAN++; } else printf("Tentativa de acessar indíce %d maior que a leitura de dados %d", idxPosicaoInicioCAN, args->arg2readSize); } printf(" Last Byte: %d\n", mensagemCANSeparada[idxNovoPacote - 1]); idxPosicaoCharPacoteLido = idxPosicaoInicioCAN - 1; contadorDebug++; WriteCAN(mensagemCANSeparada, DEFAULT_PACKET_CAN_SIZE); } } } } } } } } idxPosicaoInicioCAN = 0; // TODO - TRATAR SOBRAS DE PACOTES return NULL; }
Log Output (Last byte should be Sequencial)Seq[0] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 0
Seq[1] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 1
Seq[2] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 2
Seq[3] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 3
Seq[4] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 4
Seq[5] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 5
Seq[6] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 6
Seq[7] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 7
Seq[8] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 8
Seq[9] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 9
Seq[10] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 10
Aguardando...10
Seq[11] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 11
Seq[12] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 12
Seq[13] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 13
Seq[14] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 14
Seq[15] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 15
Seq[16] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 16
Seq[17] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 17
Seq[18] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 18
Seq[19] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 19
Seq[20] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 20
Seq[21] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 21
Aguardando...21
Seq[22] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 22
MapCANFrameToCharAndSend: Enviando dados CAN para SOCKET ID: 0 Size: 5
Packet SEQ: 0 Start Idx Of Packet 0 Total Size: 13 Last Byte: 0
Packet SEQ: 1 Start Idx Of Packet 13 Total Size: 130 Last Byte: 2
Packet SEQ: 2 Start Idx Of Packet 26 Total Size: 130 Last Byte: 3
Packet SEQ: 3 Start Idx Of Packet 39 Total Size: 130 Last Byte: 4
Packet SEQ: 4 Start Idx Of Packet 52 Total Size: 130 Last Byte: 5
Packet SEQ: 5 Start Idx Of Packet 65 Total Size: 130 Last Byte: 6
Packet SEQ: 6 Start Idx Of Packet 78 Total Size: 130 Last Byte: 7
Packet SEQ: 7 Start Idx Of Packet 91 Total Size: 130 Last Byte: 8
Packet SEQ: 8 Start Idx Of Packet 104 Total Size: 130 Last Byte: 9
Packet SEQ: 9 Start Idx Of Packet 117 Total Size: 130 Last Byte: 10
START REPEAT DATA Received:
Packet SEQ: 10 Start Idx Of Packet 0 Total Size: 130 Last Byte: 1
Packet SEQ: 11 Start Idx Of Packet 13 Total Size: 130 Last Byte: 2
Packet SEQ: 12 Start Idx Of Packet 26 Total Size: 130 Last Byte: 3
Packet SEQ: 13 Start Idx Of Packet 39 Total Size: 130 Last Byte: 4
Packet SEQ: 14 Start Idx Of Packet 52 Total Size: 130 Last Byte: 5
Packet SEQ: 15 Start Idx Of Packet 65 Total Size: 130 Last Byte: 6
Packet SEQ: 16 Start Idx Of Packet 78 Total Size: 130 Last Byte: 7
Packet SEQ: 17 Start Idx Of Packet 91 Total Size: 130 Last Byte: 8
Packet SEQ: 18 Start Idx Of Packet 104 Total Size: 130 Last Byte: 9
Packet SEQ: 19 Start Idx Of Packet 117 Total Size: 130 Last Byte: 10
Packet SEQ: 20 Start Idx Of Packet 0 Total Size: 13 Last Byte: 12
Packet SEQ: 20 Start Idx Of Packet 0 Total Size: 13 Last Byte: 12
Packet SEQ: 22 Start Idx Of Packet 0 Total Size: 13 Last Byte: 13
Packet SEQ: 23 Start Idx Of Packet 13 Total Size: 104 Last Byte: 15
Packet SEQ: 24 Start Idx Of Packet 26 Total Size: 104 Last Byte: 16
Packet SEQ: 25 Start Idx Of Packet 39 Total Size: 104 Last Byte: 17