Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:0f1c0f6579ab, 2017-11-10 (annotated)
- Committer:
- AnnaBridge
- Date:
- Fri Nov 10 16:08:43 2017 +0000
- Revision:
- 0:0f1c0f6579ab
UARTSerial example 3
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |