I would like to build a tool for viewing CAN protocol data on my computer. The CAN protocol data is captured using a microcontroller (STM32F4 discovery board) and sent to a PC via a serial port. My requirement is to send only CAN ID, DLC, DATA and time stamp (i.e at what time a particular CAN ID was received).

I have a few questions that I couldn't find good results for after searching the Internet:

  1. Is it possible to send CAN data via the serial port using some compression techniques for the data packets since the CAN protocol operates at 1Mbps and I am planning to run the serial port at 115200 baud rate? If yes, could you provide information or links?

  2. Have you seen any similar projects which send 1Mbps CAN data via serial port. If yes, could you provide information or links?

  • \$\begingroup\$ Why serial port when the discovery board has USB? \$\endgroup\$ – Turbo J May 18 '13 at 13:39
  • 1
    \$\begingroup\$ Sending data via serial port is easy. Sending via USB needs additional code in microcontroller and also on the PC side \$\endgroup\$ – robomon May 18 '13 at 13:44

I suppose that your CAN devices won't be sending data all the time. Implement a buffer (e.g. a circular buffer) and fill it while you receive data, then send out the data via your serial port. Once the buffer overflows, make sure you signal that to the host as well.

Compression only makes sense when you know your data. If the data is random, you could use e.g. RLE, which is a quite simple type of encoding and doesn't require much calculation power.

But as I said before, I don't think you will need that.

  • \$\begingroup\$ If your buffer is overflowing quickly, Can you reduce CAN Baud Rate?? CAN can run at 125/250 kbps too... If your other nodes on bus allow you! \$\endgroup\$ – Swanand May 20 '13 at 6:54
  • \$\begingroup\$ i think DMA is faster than using software buffer for CAN recieving and serial transmitting \$\endgroup\$ – ElectronS Jan 24 '16 at 14:44

I would suggest increasing the serial baud to 1Mbps, just check if your clock divides evenly so that there is little error.

It will be hard to compress the Data since in some packets it won't be possible and in others will (0,0,0,0,0,0,0,0 as data for example).

If you cannot increase the Baud, then you could rely on a big buffer. The CAN won't be transmitting all the time, it will have idle times, so you could just store everything you receive in a FIFO and just have a function that keeps sending the FIFO until it's empty, if you receive new CAN data, just add it to the FIFO. It should catch up if the CAN is not that busy.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.