示例#1
0
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
}
示例#2
0
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;
}