I have this code written and functioning that will write out the chars in cmd to a serial port for an input of two int
values. As the majority of the byte values fed are constant, I created the following code that only requires receiving the values that change frequently.
void Create_Message(int Address, int Data) { //Local Vars Address--; byte SvAdd = 1; byte FuCode = 6; byte AddHi = Address>>8; byte AddLo = Address; byte DatHi = Data>>8; byte DatLo = Data; byte AdDa[] = {SvAdd,FuCode,AddHi,AddLo,DatHi,DatLo}; unsigned int crc=CRC(AdDa,sizeof(AdDa)/sizeof(AdDa[0])); byte CrcHi = crc & 0xFF; byte CrcLo = crc >> 8; /*U8 Slave Address, U8, Function Code, U16 Address, U16 Data, U16 CRC * to *[U8 Address Split High, U8 Address Split Low, U8 Data Split High, U8 Data Split Low, U8 Function Code] */ //Send Data unsigned char cmd[8]={SvAdd,FuCode,AddHi,AddLo,DatHi,DatLo,CrcHi,CrcLo}; digitalWrite(SSerialTxControl, RS485Transmit); // Enable RS485 Transmit lcd.setCursor(0, 1); for (int i=0; i< 8; i++) { RS485Serial.write(cmd[i]); // Send string someplace /*//Serial.print(cmd[i]); //echo back (debug) if (i>1) { lcd.print(cmd[i]); lcd.print(" "); }*/ } digitalWrite(SSerialTxControl, RS485Receive); // Disable RS485 Transmit } unsigned int CRC(byte AdDa[], int Size ) { unsigned int crc16 = 0xFFFF; int pos = 0; int i = 0; /*Write CRC*/ for (pos = 0; pos < Size; pos++) { crc16 ^= AdDa[pos]; // XOR byte into least sig. byte of crc for (i = 8; i != 0; i--) // Loop over each bit { if ((crc16 & 0x0001) != 0) // If the LSB is set { crc16 >>= 1; // Shift right and XOR 0xA001 crc16 ^= 0xA001; } else // Else LSB is not set crc16 >>= 1; // Just shift right } } /*Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)*/ return crc16; }
I'm pretty new to writing code, but want to try and make this as efficient as possible. Any pointers as to how I could better optimize this function would be greatly appreciated.