Switzerland
Asked — Edited

Roboclaw, Packet Serial Mode With Crc/ How To Execute Cyclic Script In Moble App

Hi,

1. did anybody already implement the Packet Serial Mode with CRC into EZB script? before I start to translate...........maybe someone did already the work ;-)

roboclaw manual: CRC16 Checksum Calculation Roboclaw uses a CRC(Cyclic Redundancy Check) to validate each packet it receives. This is more complex than a simple checksum but prevents errors that could otherwise cause unexpected actions to execute on the Roboclaw. The CRC can be calculated using the following code(example in C): //Calculates CRC16 of nBytes of data in byte array message unsigned int crc16(unsigned char *packet, int nBytes) { for (int byte = 0; byte < nBytes; byte++) { crc = crc ^ ((unsigned int)packet[byte] << 8); for (unsigned char bit = 0; bit < 8; bit++) { if (crc & 0x8000) { crc = (crc << 1) ^ 0x1021; } else { crc = crc << 1; } } } return crc; }

2. how can I execute a script every 500ms in mobile app?


ARC Pro

Upgrade to ARC Pro

Join the ARC Pro community and gain access to a wealth of resources and support, ensuring your robot's success.

PRO
Synthiam
#1  

There isn't enough information to fully understand the protocol, but here is what you're requesting based on the code posted..

PS, i guessed most of it. Such as the sending order of the packet, the crc, and the packet data itself (super fudged)


# init the first uart to 9600 (Guessing)
uartinit(0, 0, 9600)

# define the packet size to 10
definearray($packet, 10)

# specify the packet size length (which is 10)
$nBytes = 10

# put some data in the packet
$packet[0] = 10
$packet[1] = 9
$packet[2] = 8
$packet[3] = 7
$packet[4] = 6
$packet[5] = 5
$packet[6] = 4
$packet[7] = 3
$packet[8] = 2
$packet[9] = 1

# send the packet with crc every 500ms
:loop

# init the crc variable
$crc = 0

repeat ($byte, 0, $nBytes, 1)

  if ($crc &amp; 0x8000)
    crc = (crc &lt;&lt; 1) ^ 0x1021
  ELSE
    crc = crc &lt;&lt; 1
  endif

endrepeat

  # send the packet and crc (guessing)
uartwritebinary(0, 0, $packet)
uartwrite(0, 0, $crc)

# pause for 500ms
sleep(500)

goto(loop)