send RS485 for testing Delta Sevro

Dependencies:   mbed

Fork of RS4851121R by albatross

Committer:
WeberYang
Date:
Tue Apr 17 03:35:44 2018 +0000
Branch:
RS485_DeltaSevro
Revision:
6:ec210c04bec9
Parent:
3:48b96c8c25fa
Child:
7:853fc58d8624
RS485 communication, using RS485 tx/rx and print through pc.printf

Who changed what in which revision?

UserRevisionLine numberNew contents of line
YusukeWakuta 0:c963f91bdd23 1 //相互通信確認用
WeberYang 6:ec210c04bec9 2 //modify to ASCII
YusukeWakuta 0:c963f91bdd23 3 #include "mbed.h"
YusukeWakuta 0:c963f91bdd23 4 #define BUFFER 30
WeberYang 6:ec210c04bec9 5 #include <string>
WeberYang 6:ec210c04bec9 6 #include <cstdlib>
YusukeWakuta 0:c963f91bdd23 7
WeberYang 2:bbb217e1219e 8 Serial rs485(PA_9,PA_10);//,115200);//(p9,p10);
YusukeWakuta 0:c963f91bdd23 9 Serial pc(USBTX,USBRX);
WeberYang 2:bbb217e1219e 10 DigitalOut Receiver(D7);//(p5);
WeberYang 3:48b96c8c25fa 11
WeberYang 6:ec210c04bec9 12
WeberYang 6:ec210c04bec9 13 float cnv;
WeberYang 6:ec210c04bec9 14
WeberYang 3:48b96c8c25fa 15 unsigned int CRC_Verify(unsigned char *cBuffer, unsigned int iBufLen);
WeberYang 3:48b96c8c25fa 16 void setAddress(char MotorAddress,int16_t DataAddress,int16_t Data);
WeberYang 3:48b96c8c25fa 17
WeberYang 2:bbb217e1219e 18 #define LENG 31 //0x42 + 31 bytes equal to 32 bytes
WeberYang 6:ec210c04bec9 19 unsigned char buffer[LENG];
WeberYang 2:bbb217e1219e 20 //attributes - program variables
WeberYang 2:bbb217e1219e 21 char stringOverSerialBuffer[41]; // buffer to store received string over pc
WeberYang 2:bbb217e1219e 22 int newCommandFlag = 0; // flag for ISR
WeberYang 6:ec210c04bec9 23 int len;
YusukeWakuta 0:c963f91bdd23 24
WeberYang 2:bbb217e1219e 25 char data[BUFFER];
WeberYang 6:ec210c04bec9 26 char num[16];
WeberYang 6:ec210c04bec9 27
WeberYang 6:ec210c04bec9 28 char recChar=0;
WeberYang 6:ec210c04bec9 29 char recArr[20];
WeberYang 6:ec210c04bec9 30 int index=0;
WeberYang 2:bbb217e1219e 31 int idx;
WeberYang 6:ec210c04bec9 32 bool recFlag=false;
WeberYang 3:48b96c8c25fa 33 unsigned int CRC_Verify(unsigned char *cBuffer, unsigned int iBufLen)
WeberYang 3:48b96c8c25fa 34 {
WeberYang 3:48b96c8c25fa 35 unsigned int i, j;
WeberYang 3:48b96c8c25fa 36 //#define wPolynom 0xA001
WeberYang 3:48b96c8c25fa 37 unsigned int wCrc = 0xffff;
WeberYang 3:48b96c8c25fa 38 unsigned int wPolynom = 0xA001;
WeberYang 3:48b96c8c25fa 39 /*---------------------------------------------------------------------------------*/
WeberYang 3:48b96c8c25fa 40 for (i = 0; i < iBufLen; i++)
WeberYang 3:48b96c8c25fa 41 {
WeberYang 3:48b96c8c25fa 42 wCrc ^= cBuffer[i];
WeberYang 3:48b96c8c25fa 43 for (j = 0; j < 8; j++)
WeberYang 3:48b96c8c25fa 44 {
WeberYang 3:48b96c8c25fa 45 if (wCrc &0x0001)
WeberYang 3:48b96c8c25fa 46 {
WeberYang 3:48b96c8c25fa 47 wCrc = (wCrc >> 1) ^ wPolynom;
WeberYang 3:48b96c8c25fa 48 }
WeberYang 3:48b96c8c25fa 49 else
WeberYang 3:48b96c8c25fa 50 {
WeberYang 3:48b96c8c25fa 51 wCrc = wCrc >> 1;
WeberYang 3:48b96c8c25fa 52 }
WeberYang 3:48b96c8c25fa 53 }
WeberYang 3:48b96c8c25fa 54 }
WeberYang 3:48b96c8c25fa 55 return wCrc;
WeberYang 3:48b96c8c25fa 56 }
WeberYang 6:ec210c04bec9 57 // functions
WeberYang 6:ec210c04bec9 58 void flushSerialBuffer() {
WeberYang 6:ec210c04bec9 59 while (rs485.readable()) {
WeberYang 6:ec210c04bec9 60 rs485.getc();
WeberYang 6:ec210c04bec9 61 }
WeberYang 6:ec210c04bec9 62 }
WeberYang 6:ec210c04bec9 63 void readData()
WeberYang 6:ec210c04bec9 64 {
WeberYang 6:ec210c04bec9 65 recChar = rs485.getc();
WeberYang 6:ec210c04bec9 66 recArr[index] = recChar;
WeberYang 6:ec210c04bec9 67 index++;
WeberYang 6:ec210c04bec9 68 if ((recChar == '\r') || (index>=19)) {
WeberYang 6:ec210c04bec9 69
WeberYang 6:ec210c04bec9 70 recArr[index] = 0;
WeberYang 6:ec210c04bec9 71 index = 0;
WeberYang 6:ec210c04bec9 72 pc.printf("%s\r\n", recArr);
WeberYang 6:ec210c04bec9 73 flushSerialBuffer();
WeberYang 6:ec210c04bec9 74 recFlag = true;
WeberYang 6:ec210c04bec9 75 }
WeberYang 6:ec210c04bec9 76 }
YusukeWakuta 0:c963f91bdd23 77
WeberYang 6:ec210c04bec9 78
WeberYang 3:48b96c8c25fa 79 void setAddress(char MotorAddress,int16_t DataAddress,int16_t Data)
WeberYang 3:48b96c8c25fa 80 {
WeberYang 6:ec210c04bec9 81 unsigned char sendData[16];
WeberYang 3:48b96c8c25fa 82 //int DataAddress,Data;
WeberYang 3:48b96c8c25fa 83 char DataAddressH,DataAddressL;
WeberYang 6:ec210c04bec9 84
WeberYang 3:48b96c8c25fa 85 int i;
WeberYang 6:ec210c04bec9 86
WeberYang 6:ec210c04bec9 87 Receiver = 1;
WeberYang 6:ec210c04bec9 88 wait_ms(1);
WeberYang 3:48b96c8c25fa 89 DataAddressH = ((DataAddress>>8)&0xFF);
WeberYang 3:48b96c8c25fa 90 DataAddressL = ((DataAddress>>0)&0xFF);
WeberYang 6:ec210c04bec9 91
WeberYang 3:48b96c8c25fa 92
WeberYang 6:ec210c04bec9 93 //sendData[0] = Header;//MotorAddress;
WeberYang 6:ec210c04bec9 94 sendData[0] = MotorAddress;
WeberYang 6:ec210c04bec9 95 sendData[1] = 0x03;
WeberYang 6:ec210c04bec9 96 sendData[2] = DataAddressH;
WeberYang 6:ec210c04bec9 97 sendData[3] = DataAddressL;
WeberYang 6:ec210c04bec9 98 sendData[4] = Data>>8;
WeberYang 6:ec210c04bec9 99 sendData[5] = (Data&0xFF);
WeberYang 6:ec210c04bec9 100
WeberYang 6:ec210c04bec9 101 sendData[6] = sendData[0]+sendData[1]+sendData[2]+sendData[3]+sendData[4]+sendData[5];
WeberYang 6:ec210c04bec9 102 sendData[6] = (~sendData[6]+1);
WeberYang 6:ec210c04bec9 103 rs485.printf(":");
WeberYang 6:ec210c04bec9 104 for (i=0;i<7;i++)
WeberYang 3:48b96c8c25fa 105 {
WeberYang 6:ec210c04bec9 106 rs485.printf("%02X",sendData[i]);
WeberYang 3:48b96c8c25fa 107 }
WeberYang 3:48b96c8c25fa 108 wait_ms(1);
WeberYang 3:48b96c8c25fa 109 Receiver = 0;
WeberYang 3:48b96c8c25fa 110 //RS485.attach(&onInterrupt,Serial::RxIrq);
WeberYang 3:48b96c8c25fa 111 //===========================================
WeberYang 3:48b96c8c25fa 112 }
WeberYang 6:ec210c04bec9 113 int i;
YusukeWakuta 0:c963f91bdd23 114 int main()
YusukeWakuta 0:c963f91bdd23 115 {
WeberYang 6:ec210c04bec9 116 rs485.baud(38400);
WeberYang 2:bbb217e1219e 117 pc.baud(115200);
WeberYang 3:48b96c8c25fa 118
taurin 1:41cb97261876 119 Receiver=0;
WeberYang 6:ec210c04bec9 120 rs485.attach(&readData);
WeberYang 2:bbb217e1219e 121 while(1)
WeberYang 2:bbb217e1219e 122 {
WeberYang 6:ec210c04bec9 123 recFlag = false;
WeberYang 3:48b96c8c25fa 124 setAddress(1,0x0214,0x0001);
WeberYang 6:ec210c04bec9 125 while (recFlag == false)
WeberYang 6:ec210c04bec9 126 {
WeberYang 6:ec210c04bec9 127 wait_ms(1);
WeberYang 6:ec210c04bec9 128 }
WeberYang 3:48b96c8c25fa 129 }
YusukeWakuta 0:c963f91bdd23 130 }