rs485 conversion

Dependencies:   mbed

Committer:
foxbrianr
Date:
Sun Jun 16 00:36:06 2019 +0000
Revision:
0:cc2f9ea8cd1f
demo microcom

Who changed what in which revision?

UserRevisionLine numberNew 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 }