![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Backing up an unused program in case of future need
uart.cpp@8:45a0205a298f, 2018-12-06 (annotated)
- Committer:
- andrewboyson
- Date:
- Thu Dec 06 11:40:19 2018 +0000
- Revision:
- 8:45a0205a298f
- Parent:
- 3:accba7e07a0d
Backing up
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
andrewboyson | 3:accba7e07a0d | 1 | #include "mbed.h" |
andrewboyson | 3:accba7e07a0d | 2 | static RawSerial uart(p9, p10); // tx, rx |
andrewboyson | 3:accba7e07a0d | 3 | |
andrewboyson | 3:accba7e07a0d | 4 | #define RECV_BUFFER_LENGTH 1024 |
andrewboyson | 3:accba7e07a0d | 5 | #define SEND_BUFFER_LENGTH 1024 |
andrewboyson | 3:accba7e07a0d | 6 | static char recvbuffer[RECV_BUFFER_LENGTH]; |
andrewboyson | 3:accba7e07a0d | 7 | static char sendbuffer[SEND_BUFFER_LENGTH]; |
andrewboyson | 3:accba7e07a0d | 8 | static char* pRecvPush; //Initialised in init |
andrewboyson | 3:accba7e07a0d | 9 | static char* pRecvPull; //Initialised in init |
andrewboyson | 3:accba7e07a0d | 10 | static char* pSendPush; //Initialised in init |
andrewboyson | 3:accba7e07a0d | 11 | static char* pSendPull; //Initialised in init |
andrewboyson | 3:accba7e07a0d | 12 | |
andrewboyson | 3:accba7e07a0d | 13 | static void incrementPushPullPointer(char** pp, char* pbuffer, int bufferlength) |
andrewboyson | 3:accba7e07a0d | 14 | { |
andrewboyson | 3:accba7e07a0d | 15 | ++*pp; //increment the pointer by one |
andrewboyson | 3:accba7e07a0d | 16 | if (*pp == pbuffer + bufferlength) *pp = pbuffer; //if the pointer is now beyond the end then point it back to the start |
andrewboyson | 3:accba7e07a0d | 17 | } |
andrewboyson | 3:accba7e07a0d | 18 | static void recvpush(void) //Called by the uart data received interrupt. |
andrewboyson | 3:accba7e07a0d | 19 | { |
andrewboyson | 3:accba7e07a0d | 20 | while (uart.readable()) |
andrewboyson | 3:accba7e07a0d | 21 | { |
andrewboyson | 3:accba7e07a0d | 22 | int c = uart.getc(); |
andrewboyson | 3:accba7e07a0d | 23 | *pRecvPush = c; |
andrewboyson | 3:accba7e07a0d | 24 | incrementPushPullPointer(&pRecvPush, recvbuffer, RECV_BUFFER_LENGTH); |
andrewboyson | 3:accba7e07a0d | 25 | } |
andrewboyson | 3:accba7e07a0d | 26 | } |
andrewboyson | 3:accba7e07a0d | 27 | static int sendpull(void) //Called every scan by UartMain. Returns the next byte or EOF if no more are available |
andrewboyson | 3:accba7e07a0d | 28 | { |
andrewboyson | 3:accba7e07a0d | 29 | if (pSendPull == pSendPush) return EOF; |
andrewboyson | 3:accba7e07a0d | 30 | char c = *pSendPull; |
andrewboyson | 3:accba7e07a0d | 31 | incrementPushPullPointer(&pSendPull, sendbuffer, SEND_BUFFER_LENGTH); |
andrewboyson | 3:accba7e07a0d | 32 | return c; |
andrewboyson | 3:accba7e07a0d | 33 | } |
andrewboyson | 3:accba7e07a0d | 34 | int UartRecvPull(void) //Returns the next byte or EOF if no more are available |
andrewboyson | 3:accba7e07a0d | 35 | { |
andrewboyson | 3:accba7e07a0d | 36 | if (pRecvPull == pRecvPush) return EOF; |
andrewboyson | 3:accba7e07a0d | 37 | char c = *pRecvPull; |
andrewboyson | 3:accba7e07a0d | 38 | incrementPushPullPointer(&pRecvPull, recvbuffer, RECV_BUFFER_LENGTH); |
andrewboyson | 3:accba7e07a0d | 39 | return c; |
andrewboyson | 3:accba7e07a0d | 40 | } |
andrewboyson | 3:accba7e07a0d | 41 | void UartSendPush(char c) //Called whenever something needs to be sent |
andrewboyson | 3:accba7e07a0d | 42 | { |
andrewboyson | 3:accba7e07a0d | 43 | *pSendPush = c; |
andrewboyson | 3:accba7e07a0d | 44 | incrementPushPullPointer(&pSendPush, sendbuffer, SEND_BUFFER_LENGTH); |
andrewboyson | 3:accba7e07a0d | 45 | } |
andrewboyson | 3:accba7e07a0d | 46 | void UartBaud(int baud) |
andrewboyson | 3:accba7e07a0d | 47 | { |
andrewboyson | 3:accba7e07a0d | 48 | uart.baud(baud); |
andrewboyson | 3:accba7e07a0d | 49 | } |
andrewboyson | 3:accba7e07a0d | 50 | void UartReset() |
andrewboyson | 3:accba7e07a0d | 51 | { |
andrewboyson | 3:accba7e07a0d | 52 | pRecvPush = recvbuffer; |
andrewboyson | 3:accba7e07a0d | 53 | pRecvPull = recvbuffer; |
andrewboyson | 3:accba7e07a0d | 54 | pSendPush = sendbuffer; |
andrewboyson | 3:accba7e07a0d | 55 | pSendPull = sendbuffer; |
andrewboyson | 3:accba7e07a0d | 56 | } |
andrewboyson | 3:accba7e07a0d | 57 | int UartInit() |
andrewboyson | 3:accba7e07a0d | 58 | { |
andrewboyson | 3:accba7e07a0d | 59 | UartReset(); |
andrewboyson | 3:accba7e07a0d | 60 | uart.attach(&recvpush, Serial::RxIrq); |
andrewboyson | 3:accba7e07a0d | 61 | return 0; |
andrewboyson | 3:accba7e07a0d | 62 | } |
andrewboyson | 3:accba7e07a0d | 63 | int UartMain() |
andrewboyson | 3:accba7e07a0d | 64 | { |
andrewboyson | 3:accba7e07a0d | 65 | while(uart.writeable()) |
andrewboyson | 3:accba7e07a0d | 66 | { |
andrewboyson | 3:accba7e07a0d | 67 | int c = sendpull(); |
andrewboyson | 3:accba7e07a0d | 68 | if (c == EOF) break; |
andrewboyson | 3:accba7e07a0d | 69 | uart.putc(c); |
andrewboyson | 3:accba7e07a0d | 70 | } |
andrewboyson | 3:accba7e07a0d | 71 | return 0; |
andrewboyson | 3:accba7e07a0d | 72 | } |