2020NSE_SSLB4
/
GPS_STM32F303K8
GPS受信機から得たデータをCANに流すプログラム STM32F303K8
main.cpp@1:03c3b1db6179, 2020-07-30 (annotated)
- Committer:
- sashida_h
- Date:
- Thu Jul 30 10:32:53 2020 +0000
- Revision:
- 1:03c3b1db6179
- Parent:
- 0:c0aa7d5cd549
- Child:
- 2:a217f4d56d32
initial commit
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:03c3b1db6179 | 99 | send(0.0,0x01); |
sashida_h | 0:c0aa7d5cd549 | 100 | //pc.printf("NoGPSSignal\r\n"); |
sashida_h | 0:c0aa7d5cd549 | 101 | } |
sashida_h | 0:c0aa7d5cd549 | 102 | }else{ |
sashida_h | 0:c0aa7d5cd549 | 103 | pc.printf("No_Satellite_signal\r\n"); |
sashida_h | 0:c0aa7d5cd549 | 104 | } |
sashida_h | 0:c0aa7d5cd549 | 105 | }else{ |
sashida_h | 0:c0aa7d5cd549 | 106 | cnt_gps++; |
sashida_h | 0:c0aa7d5cd549 | 107 | } |
sashida_h | 0:c0aa7d5cd549 | 108 | } |
sashida_h | 0:c0aa7d5cd549 | 109 | if(pc.readable()){ |
sashida_h | 0:c0aa7d5cd549 | 110 | pc.printf("kita!\r\n"); |
sashida_h | 0:c0aa7d5cd549 | 111 | while(1){ |
sashida_h | 0:c0aa7d5cd549 | 112 | c = pc.getc(); |
sashida_h | 0:c0aa7d5cd549 | 113 | pc.printf("%c",c); |
sashida_h | 0:c0aa7d5cd549 | 114 | } |
sashida_h | 0:c0aa7d5cd549 | 115 | } |
sashida_h | 0:c0aa7d5cd549 | 116 | } |
sashida_h | 0:c0aa7d5cd549 | 117 | } |