test program for biuart

Dependencies:   mbed

Revision:
0:40d82aa11fe0
Child:
1:36aff54b80e2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Aug 11 10:38:04 2014 +0000
@@ -0,0 +1,117 @@
+#include "mbed.h"
+#include <vector>
+
+Serial pc(USBTX, USBRX);
+Serial uart(p13, p14);
+DigitalInOut nREQ(p15);
+DigitalInOut nRDY(p16);
+
+uint16_t ccitt(uint8_t len, uint8_t* buf);
+
+uint16_t ccitt(uint8_t len, uint8_t* buf) {
+    // length is masked to 8 bits (256=0) for checksum calculation, as it is in
+    // the packet
+    uint16_t crc = 0xffff ^ (len & 0xff);
+
+    for (int i = 0; i < len; i++) {
+        crc = (crc >> 8) | (crc << 8);
+        crc ^= buf[i];
+        crc ^= (crc & 0xFF) >> 4;
+        crc ^= crc << 12;
+        crc ^= (crc & 0xFF) << 5;
+    }
+
+    return crc;
+}
+
+int main() {
+    pc.baud(38400);
+    uart.baud(38400);
+
+    pc.printf("\n\r--------\n\rUART Test\n\r");
+
+    if (uart.readable()) {
+        pc.printf("Leftover characters: ");
+        while(uart.readable()) {
+            pc.printf("%c", uart.getc());
+        }
+        pc.printf("\n\r");
+    }    
+
+    nREQ.input();
+    nREQ.mode(PullUp);
+    nRDY.input();
+    nRDY.mode(PullUp);
+
+    pc.printf("Waiting\n\r");
+
+    while(nREQ != 0) {
+        wait(0.1);
+        pc.printf("nREQ: %d\n\r", nREQ.read());
+    }
+
+    // pc.printf("nREQ has gone low\n\r");
+
+    nRDY = 0;
+    nRDY.output();
+
+    int len = uart.getc();
+    pc.printf("len: %d\n\r", len);
+    std::vector<uint8_t> payload;
+    for (int i = 0; i < len; i++) {
+        payload.push_back(uart.getc());
+        pc.printf("%d have recieved\n\r", payload.size());
+    }
+
+    uint8_t checksum = 0;
+    for (int i = 0; i < 2; i++) {
+        checksum |= ((uint16_t) (uart.getc())) << (i * 8);
+    }
+
+    pc.printf("len: %d\n\r", len);
+    pc.printf("payload: ");
+    for (int i = 0; i < len; i++) {
+        pc.printf("%c", payload[i]);
+    }
+    pc.printf("\n\r");
+    pc.printf("checksum: 0x%X\n\r", checksum);
+
+    uint16_t crc = ccitt(len, &payload[0]);
+    pc.printf("ccitt: 0x%X\n\r", crc);
+
+    nRDY.input();
+    nRDY.mode(PullUp);
+
+    pc.printf("Sending\n\r");
+
+    uint8_t* str = (uint8_t*) "HelloHelloHelloHelloHello";
+    uint8_t str_len = 5;
+    // uint16_t str_checksum = ccitt(str_len, str);
+
+    nREQ = 0;
+    nREQ.output();
+
+    while(nRDY != 0) {
+        wait(0.1);
+    }
+
+    pc.printf("got nRDY\n\r");
+
+    uart.putc(str_len);
+    for (int i = 0; i < (str_len + 1); i++) {
+        uart.putc(str[i]);
+    }
+    uart.putc(0);
+    uart.putc(0);
+
+    nREQ.input();
+    nREQ.mode(PullUp);
+
+    pc.printf("All done\n\r");
+
+    while (1) {
+        // if (uart.readable()) {
+        //     pc.printf("%c", uart.getc());
+        // }
+    }
+}
\ No newline at end of file