rs485 conversion
Dependencies: mbed
main.cpp@0:cc2f9ea8cd1f, 2019-06-16 (annotated)
- Committer:
- foxbrianr
- Date:
- Sun Jun 16 00:36:06 2019 +0000
- Revision:
- 0:cc2f9ea8cd1f
demo microcom
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
foxbrianr | 0:cc2f9ea8cd1f | 1 | #include "mbed.h" |
foxbrianr | 0:cc2f9ea8cd1f | 2 | |
foxbrianr | 0:cc2f9ea8cd1f | 3 | DigitalOut myled1(LED1); |
foxbrianr | 0:cc2f9ea8cd1f | 4 | DigitalOut myled2(LED2); |
foxbrianr | 0:cc2f9ea8cd1f | 5 | DigitalOut myled3(LED3); |
foxbrianr | 0:cc2f9ea8cd1f | 6 | DigitalOut myled4(LED3); |
foxbrianr | 0:cc2f9ea8cd1f | 7 | |
foxbrianr | 0:cc2f9ea8cd1f | 8 | DigitalOut myled(LED1); |
foxbrianr | 0:cc2f9ea8cd1f | 9 | #include "emic2.h" |
foxbrianr | 0:cc2f9ea8cd1f | 10 | |
foxbrianr | 0:cc2f9ea8cd1f | 11 | emic2 myVoice2Text(p28, p27); //serial RX,TX pins to emic |
foxbrianr | 0:cc2f9ea8cd1f | 12 | |
foxbrianr | 0:cc2f9ea8cd1f | 13 | Serial pc(USBTX, USBRX, 9600); //tx,rx,baud |
foxbrianr | 0:cc2f9ea8cd1f | 14 | |
foxbrianr | 0:cc2f9ea8cd1f | 15 | Serial rs485port1(p9, p10, 9600); //tx,rx,baud |
foxbrianr | 0:cc2f9ea8cd1f | 16 | DigitalOut rs485port1mode (p11); //Transmit = 1, Receive = 0 |
foxbrianr | 0:cc2f9ea8cd1f | 17 | |
foxbrianr | 0:cc2f9ea8cd1f | 18 | Serial rs485port2(p13, p14, 9600); //tx,rx,baud |
foxbrianr | 0:cc2f9ea8cd1f | 19 | DigitalOut rs485port2mode (p12); //Transmit = 1, Receive = 0 |
foxbrianr | 0:cc2f9ea8cd1f | 20 | |
foxbrianr | 0:cc2f9ea8cd1f | 21 | int dataRxCnt = 0; |
foxbrianr | 0:cc2f9ea8cd1f | 22 | int dataRxBuffer[4] = {0}; |
foxbrianr | 0:cc2f9ea8cd1f | 23 | int cur_address = 0; |
foxbrianr | 0:cc2f9ea8cd1f | 24 | |
foxbrianr | 0:cc2f9ea8cd1f | 25 | char fault[4]; |
foxbrianr | 0:cc2f9ea8cd1f | 26 | |
foxbrianr | 0:cc2f9ea8cd1f | 27 | void rx485Message() { |
foxbrianr | 0:cc2f9ea8cd1f | 28 | // Note: you need to actually read from the serial to clear the RX interrupt |
foxbrianr | 0:cc2f9ea8cd1f | 29 | int value = rs485port1.getc(); |
foxbrianr | 0:cc2f9ea8cd1f | 30 | |
foxbrianr | 0:cc2f9ea8cd1f | 31 | if (value){ |
foxbrianr | 0:cc2f9ea8cd1f | 32 | dataRxBuffer[dataRxCnt++]=value; |
foxbrianr | 0:cc2f9ea8cd1f | 33 | |
foxbrianr | 0:cc2f9ea8cd1f | 34 | if(dataRxCnt==4) { |
foxbrianr | 0:cc2f9ea8cd1f | 35 | cur_address = 10*(dataRxBuffer[0] -0x30) + (dataRxBuffer[1] -0x30); |
foxbrianr | 0:cc2f9ea8cd1f | 36 | pc.printf("Received >> %02d \n\r", cur_address); |
foxbrianr | 0:cc2f9ea8cd1f | 37 | memset(dataRxBuffer,0,sizeof(dataRxBuffer)); |
foxbrianr | 0:cc2f9ea8cd1f | 38 | dataRxCnt=0; |
foxbrianr | 0:cc2f9ea8cd1f | 39 | } |
foxbrianr | 0:cc2f9ea8cd1f | 40 | } |
foxbrianr | 0:cc2f9ea8cd1f | 41 | myled4 = !myled4; |
foxbrianr | 0:cc2f9ea8cd1f | 42 | } |
foxbrianr | 0:cc2f9ea8cd1f | 43 | |
foxbrianr | 0:cc2f9ea8cd1f | 44 | |
foxbrianr | 0:cc2f9ea8cd1f | 45 | void tx485Message(int address) { |
foxbrianr | 0:cc2f9ea8cd1f | 46 | |
foxbrianr | 0:cc2f9ea8cd1f | 47 | int sum =0; |
foxbrianr | 0:cc2f9ea8cd1f | 48 | |
foxbrianr | 0:cc2f9ea8cd1f | 49 | char dataTxBuffer[12]; |
foxbrianr | 0:cc2f9ea8cd1f | 50 | sum += dataTxBuffer[0] = 0x40; |
foxbrianr | 0:cc2f9ea8cd1f | 51 | sum += dataTxBuffer[1] = 0x01; |
foxbrianr | 0:cc2f9ea8cd1f | 52 | sum += dataTxBuffer[2] = address; // floor number |
foxbrianr | 0:cc2f9ea8cd1f | 53 | sum += dataTxBuffer[3] = 0x0; |
foxbrianr | 0:cc2f9ea8cd1f | 54 | sum += dataTxBuffer[4] = 0x0; |
foxbrianr | 0:cc2f9ea8cd1f | 55 | sum += dataTxBuffer[5] = 0x0; |
foxbrianr | 0:cc2f9ea8cd1f | 56 | sum += dataTxBuffer[6] = (0x30 + address / 10); |
foxbrianr | 0:cc2f9ea8cd1f | 57 | sum += dataTxBuffer[7] = (0x30 + address % 10); |
foxbrianr | 0:cc2f9ea8cd1f | 58 | ; // |
foxbrianr | 0:cc2f9ea8cd1f | 59 | sum += dataTxBuffer[8] = 0x0; |
foxbrianr | 0:cc2f9ea8cd1f | 60 | sum += dataTxBuffer[9] = 0x0; |
foxbrianr | 0:cc2f9ea8cd1f | 61 | sum += dataTxBuffer[10] = 0x0; |
foxbrianr | 0:cc2f9ea8cd1f | 62 | sum += dataTxBuffer[11] = (char)(~sum +1); |
foxbrianr | 0:cc2f9ea8cd1f | 63 | |
foxbrianr | 0:cc2f9ea8cd1f | 64 | for(int i= 0;i<12;i++){ |
foxbrianr | 0:cc2f9ea8cd1f | 65 | rs485port2.putc(dataTxBuffer[i]); |
foxbrianr | 0:cc2f9ea8cd1f | 66 | } |
foxbrianr | 0:cc2f9ea8cd1f | 67 | |
foxbrianr | 0:cc2f9ea8cd1f | 68 | } |
foxbrianr | 0:cc2f9ea8cd1f | 69 | void say (char *format, ...) |
foxbrianr | 0:cc2f9ea8cd1f | 70 | { |
foxbrianr | 0:cc2f9ea8cd1f | 71 | char buffer[128]; |
foxbrianr | 0:cc2f9ea8cd1f | 72 | va_list args; |
foxbrianr | 0:cc2f9ea8cd1f | 73 | va_start(args, format); |
foxbrianr | 0:cc2f9ea8cd1f | 74 | vsprintf(buffer,format,args); |
foxbrianr | 0:cc2f9ea8cd1f | 75 | |
foxbrianr | 0:cc2f9ea8cd1f | 76 | myVoice2Text.speakf("S");//Speak command starts with "S" |
foxbrianr | 0:cc2f9ea8cd1f | 77 | myVoice2Text.speakf(buffer); |
foxbrianr | 0:cc2f9ea8cd1f | 78 | myVoice2Text.speakf("\r"); |
foxbrianr | 0:cc2f9ea8cd1f | 79 | myVoice2Text.ready(); |
foxbrianr | 0:cc2f9ea8cd1f | 80 | |
foxbrianr | 0:cc2f9ea8cd1f | 81 | |
foxbrianr | 0:cc2f9ea8cd1f | 82 | va_end(args); |
foxbrianr | 0:cc2f9ea8cd1f | 83 | } |
foxbrianr | 0:cc2f9ea8cd1f | 84 | |
foxbrianr | 0:cc2f9ea8cd1f | 85 | |
foxbrianr | 0:cc2f9ea8cd1f | 86 | int main() { |
foxbrianr | 0:cc2f9ea8cd1f | 87 | |
foxbrianr | 0:cc2f9ea8cd1f | 88 | pc.printf("\n\r"); |
foxbrianr | 0:cc2f9ea8cd1f | 89 | pc.printf("------------------------\n\r"); |
foxbrianr | 0:cc2f9ea8cd1f | 90 | pc.printf("Serial Test\n\r"); |
foxbrianr | 0:cc2f9ea8cd1f | 91 | pc.printf("version = %s %s\n\r", __DATE__, __TIME__ ); |
foxbrianr | 0:cc2f9ea8cd1f | 92 | pc.printf("------------------------\n\r"); |
foxbrianr | 0:cc2f9ea8cd1f | 93 | rs485port1mode = 0; // Receive |
foxbrianr | 0:cc2f9ea8cd1f | 94 | rs485port2mode = 1; // Transmit |
foxbrianr | 0:cc2f9ea8cd1f | 95 | |
foxbrianr | 0:cc2f9ea8cd1f | 96 | |
foxbrianr | 0:cc2f9ea8cd1f | 97 | myVoice2Text.voice(2); |
foxbrianr | 0:cc2f9ea8cd1f | 98 | say("hello"); |
foxbrianr | 0:cc2f9ea8cd1f | 99 | |
foxbrianr | 0:cc2f9ea8cd1f | 100 | rs485port1.attach(&rx485Message); |
foxbrianr | 0:cc2f9ea8cd1f | 101 | |
foxbrianr | 0:cc2f9ea8cd1f | 102 | while(1) { |
foxbrianr | 0:cc2f9ea8cd1f | 103 | |
foxbrianr | 0:cc2f9ea8cd1f | 104 | myled1 != myled1; |
foxbrianr | 0:cc2f9ea8cd1f | 105 | wait(0.2); |
foxbrianr | 0:cc2f9ea8cd1f | 106 | |
foxbrianr | 0:cc2f9ea8cd1f | 107 | myled2 = 0; |
foxbrianr | 0:cc2f9ea8cd1f | 108 | myled3 = 0; |
foxbrianr | 0:cc2f9ea8cd1f | 109 | |
foxbrianr | 0:cc2f9ea8cd1f | 110 | #if 0 |
foxbrianr | 0:cc2f9ea8cd1f | 111 | if(rs485port1.readable() ) { |
foxbrianr | 0:cc2f9ea8cd1f | 112 | memset(data,0,sizeof(data)); |
foxbrianr | 0:cc2f9ea8cd1f | 113 | rs485port1.scanf("%2s", data); |
foxbrianr | 0:cc2f9ea8cd1f | 114 | for (int i = 0 ; i < sizeof(data);i++){ |
foxbrianr | 0:cc2f9ea8cd1f | 115 | pc.printf("%02x ", data[i]); |
foxbrianr | 0:cc2f9ea8cd1f | 116 | } |
foxbrianr | 0:cc2f9ea8cd1f | 117 | pc.printf("\n\r"); |
foxbrianr | 0:cc2f9ea8cd1f | 118 | |
foxbrianr | 0:cc2f9ea8cd1f | 119 | myled2 = 1; |
foxbrianr | 0:cc2f9ea8cd1f | 120 | } |
foxbrianr | 0:cc2f9ea8cd1f | 121 | else { |
foxbrianr | 0:cc2f9ea8cd1f | 122 | pc.printf("No serial data on port 1.\r\n"); |
foxbrianr | 0:cc2f9ea8cd1f | 123 | myled3 = 1; |
foxbrianr | 0:cc2f9ea8cd1f | 124 | } |
foxbrianr | 0:cc2f9ea8cd1f | 125 | #endif |
foxbrianr | 0:cc2f9ea8cd1f | 126 | |
foxbrianr | 0:cc2f9ea8cd1f | 127 | if (cur_address) |
foxbrianr | 0:cc2f9ea8cd1f | 128 | { |
foxbrianr | 0:cc2f9ea8cd1f | 129 | tx485Message(cur_address); |
foxbrianr | 0:cc2f9ea8cd1f | 130 | say("%d is open", cur_address); |
foxbrianr | 0:cc2f9ea8cd1f | 131 | } |
foxbrianr | 0:cc2f9ea8cd1f | 132 | |
foxbrianr | 0:cc2f9ea8cd1f | 133 | wait_ms(1000); |
foxbrianr | 0:cc2f9ea8cd1f | 134 | } |
foxbrianr | 0:cc2f9ea8cd1f | 135 | } |