Sorry for the late reply.
Did you measure that signal through a breadboard or direct jumper cable between board + logic probe?
Initially the probe was on the JST connector that is directly on the board. I have tested after that with the probe at the end of two 18cm cables joined by a PCB and I haven’t seen any changes for write
outputs.
So, I suspected the problem comes from the read
process. To test this, first a little background: the communication is performed using a half-duplex TTL using a pair of 74LVC1G125 and 1G126 buffers that control the communication direction and also act as voltage adapters (the communication bus is working at 5V nominal). A typical circuit is here (top right of the schematic). So, to make sure that the signal is not distorted by the buffer processing I added another probe directly on the PB11 (RX3) pin.
To test the handling of read
I have use the following script that simply waits for a command and then stores it in a buffer to be inspected. The DYNAMIXEL objects are not that important to understand, they handle the duplex handling by switching the PB12 pin. The rest is practically forwarding the commands to the normal Serial API.
#include <Arduino.h>
#include <Dynamixel2Arduino.h>
extern "C" void SystemClock_Config(void)
{
...
}
DYNAMIXEL::SerialPortHandler dxl_port(Serial3, PB12);
DYNAMIXEL::Slave device(dxl_port, 0x5301);
void setup() {
pinMode(PB8, OUTPUT);
dxl_port.begin(1000000);
...
}
bool blink = false;
uint8_t buffer[128];
uint8_t pos = 0;
uint8_t len = 0;
void loop() {
// there is some code here that blinks a LED to make sure that code is running
...
while (device.getPort()->available() > 0) {
int c = device.getPort()->read();
buffer[pos] = (uint8_t)c;
pos++;
}
if (pos > 0) {
// here breakpoint!
len = pos;
pos = 0;
}
}
Running the code above for speed of 1mbps I can send for the computer a command using DynamixelWizard, for instance a PING command that looks like this:

The probe shows:
There is no degradation of signal between the two probes and they match the sent message. The program on the controllers stops at the breakpoint and the watch for buffer
shows:

So, at this speed all seems fine, the message was received accurately. To test with a longer message we can try a READ message (from ID 1, starting address 1, length 1):

This one is also received correctly by the controller and the buffer shows:

Switching to 2mbps, first sending the same PING message the probe shows:
There is no degradation of the signal, so the message seems to arrive at the RX3 pin correctly. The program though drops bytes from the message:

You see that the first 3 bytes were received correctly, then 2 bytes were dropped completely, two bytes again were correctly read, the next two again dropped, and the last one was correctly received.
Checking with the longer READ message the script received the following:

Compared with the original message, again the first 3 bytes were correctly received (0xFF, 0xFF, 0xFD), followed by 2 bytes dropped (0x00, 0x01), two bytes received(0x07, 0x00), two bytes dropped (0x02, 0x01), two bytes read (0x00, 0x01), two dropped (0x00, 0x22) and finally one read (0xCF).