Skip to content

Compilation fails due to modbus.c #8

@jonas-hagen

Description

@jonas-hagen

When trying to build a firmware for Controllino Micro using ModbusTCP, compilation fails. The same error can be reproduced when selecting the example Examples->ArduinoModbus->TCP->EthernetModbusServerLED in Arduino IDE (2.3.3) and trying to compile for Controllino Micro RP2040.

FQBN: controllino_rp2:rp2040:controllino_micro
Using board 'controllino_micro' from platform in folder: /home/user/.arduino15/packages/controllino_rp2/hardware/rp2040/2.0.0
Using core 'rp2040' from platform in folder: /home/user/.arduino15/packages/controllino_rp2/hardware/rp2040/2.0.0
...
In file included from /home/user/.arduino15/packages/controllino_rp2/hardware/rp2040/2.0.0/variants/controllino_micro/pins_arduino.h:212,
                 from /home/user/.arduino15/packages/controllino_rp2/hardware/rp2040/2.0.0/cores/rp2040/Arduino.h:30,
                 from /home/user/.arduino15/packages/controllino_rp2/hardware/rp2040/2.0.0/libraries/ArduinoModbus/src/libmodbus/modbus.c:23:
/home/user/.arduino15/packages/controllino_rp2/hardware/rp2040/2.0.0/variants/controllino_micro/wiring.h:28:1: error: unknown type name 'class'
   28 | class ControllinoPin{
      | ^~~~~
/home/user/.arduino15/packages/controllino_rp2/hardware/rp2040/2.0.0/variants/controllino_micro/wiring.h:28:21: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
   28 | class ControllinoPin{
      |                     ^
/home/user/.arduino15/packages/controllino_rp2/hardware/rp2040/2.0.0/variants/controllino_micro/wiring.h:60:8: error: unknown type name 'ControllinoPin'
   60 | extern ControllinoPin* getControllinoPin(int pin);
      |        ^~~~~~~~~~~~~~
...
Multiple libraries were found for "Ethernet.h"
  Used: /home/user/projects/xxx/cool_xxx/libraries/Ethernet
  Not used: /home/user/.arduino15/libraries/Ethernet
Using library Ethernet at version 2.0.2 in folder: /home/user/projects/xxx/cool_xxx/libraries/Ethernet 
Using library ArduinoRS485 at version 1.1.0 in folder: /home/user/.arduino15/packages/controllino_rp2/hardware/rp2040/2.0.0/libraries/ArduinoRS485 
Using library ArduinoModbus at version 1.0.9 in folder: /home/user/.arduino15/packages/controllino_rp2/hardware/rp2040/2.0.0/libraries/ArduinoModbus 
exit status 1

Compilation error: exit status 1

The full error log from compiling the above example is attached.

The reason for this seems to be that modbus.c is a c file, but the files included by Arduino.h are cpp code using classes for ControllinoPin.

I am not an Arduino expert, and in my limited view I only see two possible solutions:

  1. Do not use C++ in everything included by Arduino.h
  2. Port libmodbus to C++ (which I tried, see below patch, it compiles, but not yet tested)

Or is there an easy workaround?

diff modbus.c modbus.cpp

726c726
<                               const char* template, ...)
---
>                               const char* template_, ...)
734,735c734,735
<         va_start(ap, template);
<         vfprintf(stderr, template, ap);
---
>         va_start(ap, template_);
>         vfprintf(stderr, template_, ap);
995,996c995,996
<             uint16_t and = (req[offset + 3] << 8) + req[offset + 4];
<             uint16_t or = (req[offset + 5] << 8) + req[offset + 6];
---
>             uint16_t and_ = (req[offset + 3] << 8) + req[offset + 4];
>             uint16_t or_ = (req[offset + 5] << 8) + req[offset + 6];
998c998
<             data = (data & and) | (or & (~and));
---
>             data = (data & and_) | (or_ & (~and_));
1907,1909c1907,1909
<     register char *d = dest;
<     register const char *s = src;
<     register size_t n = dest_size;
---
>     char *d = dest;
>     const char *s = src;
>     size_t n = dest_size;

compile_output.txt

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions