byte SmeSFX::sfxSendData(const char payload[], byte payloadLen) { if (SFX_MAX_PAYLOAD<payloadLen) return SME_EINVAL; // too long payload memset(message, 0 , sizeof(message)); //clear old message message[0] = SFX_MSG_HEADER; message[1] = payloadLen; message[2] = SFX_DATA; message[3] = getNewSequenceNumber(); for (int i=0; i<payloadLen; i++) { message[4+i] = payload[i]; } // store the message Id that will be sent sfxMessageIdx[DATA_SEQUENCE_NUMBER] = message[3]; byte crcLen= insertCRC(&message[4+payloadLen], payload, SFX_DATA, message[3], payloadLen); // the 4 is due by the Header+payloadLen+DataType+Sequence message[4+payloadLen+crcLen] = SFX_MSG_TAILER; size_t messageLen = 4+payloadLen+crcLen +1; // add the Tailer, too // reset answer Fsm and Ackoledge dataAck = SFX_DATA_ACK_START; recFsm=headerRec; // clear the rx buffer pointer answer.payloadPtr=0; memset(answer.payload, 0 , sizeof(answer.payload)); // set the FSM to sending Data sfxMode = sfxDataMode; sendSFXMsg((const char*)message, messageLen); return 1; // just return true in first library release }
int rlModbus::write(int slave, int function, const unsigned char *data, int datalen, int *transactionID) { int len,i; if(slave < 0 || slave > 255) return MODBUS_ERROR; len = 0; if(mode == MODBUS_ASCII) { tel[len++] = ':'; sprintf((char *) &tel[len], "%02X", slave); len += 2; sprintf((char *) &tel[len], "%02X", function); len += 2; for(i=0; i<datalen; i++) { sprintf((char *) &tel[len], "%02X",(int) data[i]); len += 2; if((len+4) > maxtel) return MODBUS_ERROR; } insertLRC(len); len += 2; tel[len++] = 0x0d; if(delimitor == 0x0a) tel[len++] = 0x0a; } else if(mode == MODBUS_RTU) { if(s != NULL) { if(transactionID == NULL) { tel[len++] = 0; // bytes 0,1 Transaction ID. Not important. Usually zero when making a request, the server will copy them faithfully into the response. tel[len++] = 0; } else { tel[len++] = ((*transactionID) & 0xFF00) / 256; // bytes 0,1 Transaction ID. tel[len++] = (*transactionID) & 0xFF; } tel[len++] = 0; // bytes 2,3 Protocol number. Must be zero. tel[len++] = 0; tel[len++] = 0; // byte 4 Length (upper byte). Since all requests will be less than 256 bytes in length (!), this will always be zero. tel[len++] = 2+datalen; // byte 5 Length (lower byte). Equal to the number of bytes which follow } tel[len++] = (unsigned char) slave; tel[len++] = (unsigned char) function; for(i=0; i<datalen; i++) { tel[len++] = data[i]; if((len+2) > maxtel) return MODBUS_ERROR; } insertCRC(len); len += 2; } else return MODBUS_ERROR; if(s != NULL) { if(s->isConnected() == 0) { if(autoreconnectSocket) s->connect(); if(s->isConnected() == 0) return MODBUS_ERROR; } if(s->write(tel,len-2) < 0) return MODBUS_ERROR; // don't send LRC or CRC } else if(tty != NULL) { if(tty->writeBlock(tel,len) < 0) return MODBUS_ERROR; } else return MODBUS_ERROR; return MODBUS_SUCCESS; }