GPS受信機から得たデータをCANに流すプログラム STM32F303K8

Dependencies:   mbed LSM303D

Committer:
sashida_h
Date:
Wed Jul 22 17:07:51 2020 +0000
Revision:
0:c0aa7d5cd549
Child:
1:03c3b1db6179
initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sashida_h 0:c0aa7d5cd549 1 #include "mbed.h"
sashida_h 0:c0aa7d5cd549 2
sashida_h 0:c0aa7d5cd549 3 DigitalOut myled(LED1);
sashida_h 0:c0aa7d5cd549 4 Serial gps(PA_9, PA_10,38400);
sashida_h 0:c0aa7d5cd549 5 Serial pc(PA_2, PA_3,115200);
sashida_h 0:c0aa7d5cd549 6 CAN can(PA_11, PA_12); //pin21,22 rd,td
sashida_h 0:c0aa7d5cd549 7
sashida_h 0:c0aa7d5cd549 8 CANMessage msg;
sashida_h 0:c0aa7d5cd549 9
sashida_h 0:c0aa7d5cd549 10 union Float2Byte{
sashida_h 0:c0aa7d5cd549 11 float _float;
sashida_h 0:c0aa7d5cd549 12 char _byte[4];
sashida_h 0:c0aa7d5cd549 13 };
sashida_h 0:c0aa7d5cd549 14 typedef union Float2Byte Float2Byte;
sashida_h 0:c0aa7d5cd549 15
sashida_h 0:c0aa7d5cd549 16 float _DMS2DEG(float raw_data){
sashida_h 0:c0aa7d5cd549 17 int d=(int)(raw_data/100);
sashida_h 0:c0aa7d5cd549 18 float m=(raw_data-(float)d*100);
sashida_h 0:c0aa7d5cd549 19 return (float)d+m/60;
sashida_h 0:c0aa7d5cd549 20 }
sashida_h 0:c0aa7d5cd549 21
sashida_h 0:c0aa7d5cd549 22 void send(float senddata,int id){
sashida_h 0:c0aa7d5cd549 23 //pc.printf("Master send()\n\r");
sashida_h 0:c0aa7d5cd549 24
sashida_h 0:c0aa7d5cd549 25 /*ID: 0x01*/
sashida_h 0:c0aa7d5cd549 26 Float2Byte sendFloat;
sashida_h 0:c0aa7d5cd549 27 sendFloat._float = senddata;
sashida_h 0:c0aa7d5cd549 28 //ここに送りたい値を入れる.
sashida_h 0:c0aa7d5cd549 29
sashida_h 0:c0aa7d5cd549 30 char serialData[4];
sashida_h 0:c0aa7d5cd549 31 for(int i=0;i<4;++i){
sashida_h 0:c0aa7d5cd549 32 serialData[i] = sendFloat._byte[i];
sashida_h 0:c0aa7d5cd549 33 //pc.printf("send_char: %d\n\r", serialData[i]);
sashida_h 0:c0aa7d5cd549 34 }
sashida_h 0:c0aa7d5cd549 35 //pc.printf("sendFloat: %f\n\r", sendFloat._float);
sashida_h 0:c0aa7d5cd549 36 if(can.write(CANMessage(id, serialData, 4))){
sashida_h 0:c0aa7d5cd549 37 pc.printf("Send.\n\r");
sashida_h 0:c0aa7d5cd549 38 }
sashida_h 0:c0aa7d5cd549 39
sashida_h 0:c0aa7d5cd549 40
sashida_h 0:c0aa7d5cd549 41 myled = !myled;
sashida_h 0:c0aa7d5cd549 42 }
sashida_h 0:c0aa7d5cd549 43
sashida_h 0:c0aa7d5cd549 44 void receive(){
sashida_h 0:c0aa7d5cd549 45 Float2Byte getFloat;
sashida_h 0:c0aa7d5cd549 46
sashida_h 0:c0aa7d5cd549 47 if(can.read(msg)){
sashida_h 0:c0aa7d5cd549 48 /*ID: 0x01*/
sashida_h 0:c0aa7d5cd549 49 if(msg.id == 0x01){
sashida_h 0:c0aa7d5cd549 50 //pc.printf("ID: 0x01\n\r");
sashida_h 0:c0aa7d5cd549 51 for(int i=0;i<4;++i){
sashida_h 0:c0aa7d5cd549 52 getFloat._byte[i] = msg.data[i];
sashida_h 0:c0aa7d5cd549 53 //pc.printf("get_char: %d\n\r", getFloat._byte[i]);
sashida_h 0:c0aa7d5cd549 54 }
sashida_h 0:c0aa7d5cd549 55 pc.printf("%.2f\r\n", getFloat._float);
sashida_h 0:c0aa7d5cd549 56 myled = !myled;
sashida_h 0:c0aa7d5cd549 57 }
sashida_h 0:c0aa7d5cd549 58 /*ID: 0x02*/
sashida_h 0:c0aa7d5cd549 59 if(msg.id == 0x02){
sashida_h 0:c0aa7d5cd549 60 //pc.printf("ID: 0x02\n\r");
sashida_h 0:c0aa7d5cd549 61 for(int i=0;i<4;++i){
sashida_h 0:c0aa7d5cd549 62 getFloat._byte[i] = msg.data[i];
sashida_h 0:c0aa7d5cd549 63 //pc.printf("get_char: %d\n\r", getFloat._byte[i]);
sashida_h 0:c0aa7d5cd549 64 }
sashida_h 0:c0aa7d5cd549 65 pc.printf("%.3f\n\r", getFloat._float);
sashida_h 0:c0aa7d5cd549 66 myled = !myled;
sashida_h 0:c0aa7d5cd549 67 }
sashida_h 0:c0aa7d5cd549 68 }
sashida_h 0:c0aa7d5cd549 69
sashida_h 0:c0aa7d5cd549 70 }
sashida_h 0:c0aa7d5cd549 71
sashida_h 0:c0aa7d5cd549 72 int main() {
sashida_h 0:c0aa7d5cd549 73 char gps_data[256];
sashida_h 0:c0aa7d5cd549 74 int cnt_gps=0;
sashida_h 0:c0aa7d5cd549 75 char c;
sashida_h 0:c0aa7d5cd549 76 pc.printf("Start\r\n");
sashida_h 0:c0aa7d5cd549 77 can.attach(receive, CAN::RxIrq);
sashida_h 0:c0aa7d5cd549 78 while(1){
sashida_h 0:c0aa7d5cd549 79 if(gps.readable()){
sashida_h 0:c0aa7d5cd549 80 gps_data[cnt_gps] = gps.getc();
sashida_h 0:c0aa7d5cd549 81 if(gps_data[cnt_gps] == '$' || cnt_gps ==256){
sashida_h 0:c0aa7d5cd549 82 cnt_gps = 0;
sashida_h 0:c0aa7d5cd549 83 memset(gps_data,'\0',256);
sashida_h 0:c0aa7d5cd549 84 }else if(gps_data[cnt_gps] == '\r'){
sashida_h 0:c0aa7d5cd549 85 float world_time, lon_east, lat_north;
sashida_h 0:c0aa7d5cd549 86 int rlock, sat_num;
sashida_h 0:c0aa7d5cd549 87 char lat,lon;
sashida_h 0:c0aa7d5cd549 88 if(sscanf(gps_data,"GPGGA,%f,%f,%c,%f,%c,%d,%d",&world_time,&lat_north,&lat,&lon_east,&lon,&rlock,&sat_num)>=1){
sashida_h 0:c0aa7d5cd549 89 if(rlock==1 || rlock==2){
sashida_h 0:c0aa7d5cd549 90 lat_north = _DMS2DEG(lat_north);
sashida_h 0:c0aa7d5cd549 91 lon_east = _DMS2DEG(lon_east);
sashida_h 0:c0aa7d5cd549 92 //pc.printf("%s\r\n",gps_data);
sashida_h 0:c0aa7d5cd549 93 pc.printf("Lat:%f,Lon:%f\r\ntime:%f,sat_num:%d\r\n",lat_north,lon_east,world_time,sat_num);
sashida_h 0:c0aa7d5cd549 94 //pc.printf("Lat:%f,Lon:%f,MAX_ALT:%f\r\n",lat_north,lon_east,alt_max);
sashida_h 0:c0aa7d5cd549 95 send(world_time,0x01);
sashida_h 0:c0aa7d5cd549 96
sashida_h 0:c0aa7d5cd549 97 }else{
sashida_h 0:c0aa7d5cd549 98 pc.printf("%s\r\n",gps_data);
sashida_h 0:c0aa7d5cd549 99 //pc.printf("NoGPSSignal\r\n");
sashida_h 0:c0aa7d5cd549 100 }
sashida_h 0:c0aa7d5cd549 101 }else{
sashida_h 0:c0aa7d5cd549 102 pc.printf("No_Satellite_signal\r\n");
sashida_h 0:c0aa7d5cd549 103 }
sashida_h 0:c0aa7d5cd549 104 }else{
sashida_h 0:c0aa7d5cd549 105 cnt_gps++;
sashida_h 0:c0aa7d5cd549 106 }
sashida_h 0:c0aa7d5cd549 107 }
sashida_h 0:c0aa7d5cd549 108 if(pc.readable()){
sashida_h 0:c0aa7d5cd549 109 pc.printf("kita!\r\n");
sashida_h 0:c0aa7d5cd549 110 while(1){
sashida_h 0:c0aa7d5cd549 111 c = pc.getc();
sashida_h 0:c0aa7d5cd549 112 pc.printf("%c",c);
sashida_h 0:c0aa7d5cd549 113 }
sashida_h 0:c0aa7d5cd549 114 }
sashida_h 0:c0aa7d5cd549 115 }
sashida_h 0:c0aa7d5cd549 116 }