Anna Bridge / Mbed OS UARTSerial_Example2
Committer:
AnnaBridge
Date:
Fri Nov 10 16:08:43 2017 +0000
Revision:
0:0f1c0f6579ab
UARTSerial example 3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AnnaBridge 0:0f1c0f6579ab 1 #include "mbed.h"
AnnaBridge 0:0f1c0f6579ab 2
AnnaBridge 0:0f1c0f6579ab 3 UARTSerial pc(USBTX, USBRX);
AnnaBridge 0:0f1c0f6579ab 4 UARTSerial device(MBED_CONF_APP_UART1_TX, MBED_CONF_APP_UART1_RX);
AnnaBridge 0:0f1c0f6579ab 5
AnnaBridge 0:0f1c0f6579ab 6 static void copy_some(FileHandle *out, FileHandle *in) {
AnnaBridge 0:0f1c0f6579ab 7 // To ensure performance, allow to read multiple bytes at once, although
AnnaBridge 0:0f1c0f6579ab 8 // we don't expect to read many in practice.
AnnaBridge 0:0f1c0f6579ab 9
AnnaBridge 0:0f1c0f6579ab 10 // read() will return immediately, as we've already
AnnaBridge 0:0f1c0f6579ab 11 // checked that `in` is ready with poll()
AnnaBridge 0:0f1c0f6579ab 12 char buffer[32];
AnnaBridge 0:0f1c0f6579ab 13 ssize_t read = in->read(buffer, sizeof buffer);
AnnaBridge 0:0f1c0f6579ab 14 if (read <= 0) {
AnnaBridge 0:0f1c0f6579ab 15 error("Input error");
AnnaBridge 0:0f1c0f6579ab 16 }
AnnaBridge 0:0f1c0f6579ab 17
AnnaBridge 0:0f1c0f6579ab 18 // Then write them all out. Assuming output port is similar speed to input,
AnnaBridge 0:0f1c0f6579ab 19 // this may block briefly, but not significantly.
AnnaBridge 0:0f1c0f6579ab 20 ssize_t written = 0;
AnnaBridge 0:0f1c0f6579ab 21 while (written < read) {
AnnaBridge 0:0f1c0f6579ab 22 ssize_t w = out->write(buffer + written, read - written);
AnnaBridge 0:0f1c0f6579ab 23 if (w <= 0) {
AnnaBridge 0:0f1c0f6579ab 24 error("Output error");
AnnaBridge 0:0f1c0f6579ab 25 }
AnnaBridge 0:0f1c0f6579ab 26 written += w;
AnnaBridge 0:0f1c0f6579ab 27 }
AnnaBridge 0:0f1c0f6579ab 28 }
AnnaBridge 0:0f1c0f6579ab 29
AnnaBridge 0:0f1c0f6579ab 30 int main() {
AnnaBridge 0:0f1c0f6579ab 31 char buffer[32];
AnnaBridge 0:0f1c0f6579ab 32 pollfh fds[2];
AnnaBridge 0:0f1c0f6579ab 33
AnnaBridge 0:0f1c0f6579ab 34 fds[0].fh = &pc;
AnnaBridge 0:0f1c0f6579ab 35 fds[0].events = POLLIN;
AnnaBridge 0:0f1c0f6579ab 36 fds[1].fh = &device;
AnnaBridge 0:0f1c0f6579ab 37 fds[1].events = POLLIN;
AnnaBridge 0:0f1c0f6579ab 38
AnnaBridge 0:0f1c0f6579ab 39 while (1) {
AnnaBridge 0:0f1c0f6579ab 40 // Block until either of the 2 ports is readable (or has an error)
AnnaBridge 0:0f1c0f6579ab 41 poll(fds, 2, -1);
AnnaBridge 0:0f1c0f6579ab 42
AnnaBridge 0:0f1c0f6579ab 43 if (fds[0].revents) {
AnnaBridge 0:0f1c0f6579ab 44 copy_some(fds[1].fh, fds[0].fh);
AnnaBridge 0:0f1c0f6579ab 45 }
AnnaBridge 0:0f1c0f6579ab 46 if (fds[1].revents) {
AnnaBridge 0:0f1c0f6579ab 47 copy_some(fds[0].fh, fds[1].fh);
AnnaBridge 0:0f1c0f6579ab 48 }
AnnaBridge 0:0f1c0f6579ab 49 }
AnnaBridge 0:0f1c0f6579ab 50 }