5 years, 7 months ago.

I want send my cmd to serial,but i dont know what function i can use?

char tp[]={0x5A,0xA5,0x07,0x82,0x00,0x01,0xCE,0xC2,0xB6,0xC8};

if on arduino ,i can use example serial.write(tp);

but i found mbed is write (const uint8_t *buffer, int length, const event_callback_t &callback, int event=SERIAL_EVENT_TX_COMPLETE);

please ask,what is this const event_callback_t &callback and int event=SERIAL_EVENT_TX_COMPLETE ? i only need buffer and length.How should i do?

and,Mbed whats different between puts(); and write();?

mbed doc website are too few examples,only have printf()................

1 Answer

5 years, 7 months ago.

Hello Liu,

I know (from my own experience) how annoying it could be when simple things do not work. So below is my humble attempt for explanation:

In addition to it's basic function, the write function in mbed enables to call an additional function when a specified event happens.

  • To tell the write function which function you would like it to call, you must pass it a pointer that is pointing to such function (also known as callback function). That's the meaning of the &callback argument (address of a function to be called). The function to be called by the write function must meet some criteria, that is, it must be of event_callback_t type. The const before event_callback_t ensures that the write function is not going to change the &callback function pointer. That was a brief explanation of:

const event_callback_t &callback
  • You must also tell the write function when the callback function shall be called, that is, the event on which it shall be called. That's the purpose of the event argument. It must be of int type (there are various such int values predefined by mbed team). The expression =SERIAL_EVENT_TX_COMPLETE is specifying that the event when all bytes from the buffer has been sent to the serial port is used as default value in case when you do not pass any event argument to the write function. That was a simplified explanation of:

 int event=SERIAL_EVENT_TX_COMPLETE

However in mbed the write function isn't defined directly in the Serial class but rather inherited from the Stream class (one of the Serial's predecessors). And because the write function is declared in Stream as protected function, it cannot be called in application software (a program designed by us, users) as a member function of aSerial object. Instead, we shall use the putc function (see below how). Nevertheless, I think that the explanation above could be useful anyway.

The main difference between write and puts functions:

  • write is used to send a specific (known) number of bytes, which is passed as second argument. See here for more details.
  • puts is used for sending bytes stored in c-style string (an array terminated with null character, which actually is a 0). The number of bytes is not passed to it. Instead, the puts function checks each byte before sending it. When the byte is a terminating null character ('\0') it stops sending the bytes from the c-style string. The terminating null-character is not sent. Before finishing, it sends one new line character ('\n') as explained here.

Because write is not available, you can accomplish the task by using the putc function, for example as follows:

#include <mbed.h>

Serial  serial(USBTX, USBRX);   // default baudrate is 9600
char    tp[] = { 0x5A, 0xA5, 0x07, 0x82, 0x00, 0x01, 0xCE, 0xC2, 0xB6, 0xC8 };

int main()
{
    size_t  tp_len = (sizeof(tp) / sizeof(*tp));  // calculate the length of tp array (useful for long arrays)

    for (size_t i = 0; i < tp_len; i++)
        serial.putc(tp[i]);
}

Another option is to define a new function (could be put in your own library) and call it from the main, for example as follows:

#include <mbed.h>

Serial  pc(USBTX, USBRX);   // default baudrate is 9600
char    tp[] = { 0x5A, 0xA5, 0x07, 0x82, 0x00, 0x01, 0xCE, 0xC2, 0xB6, 0xC8 };

void writeToSerial(Serial* serial, char* buf, size_t len)
{
    for (size_t i = 0; i < len; i++)
        serial->putc(tp[i]);
}

int main()
{
    size_t  tp_len = (sizeof(tp) / sizeof(*tp));    // calculate the length of array
    
    writeToSerial(&pc, tp, tp_len);
}