teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

書式の改善

2021/02/22 09:24

投稿

sk009
sk009

スコア0

title CHANGED
File without changes
body CHANGED
@@ -9,9 +9,8 @@
9
9
 
10
10
  ![イメージ説明](0906bbc62b2bb82ef1c4b0b28260dc3c.png)
11
11
 
12
- ### 該当のソースコード
12
+ ### PC側のソースコード(言語:C言語,開発環境:Visual Studio2017)
13
13
  ```
14
- PC側のソースコード(言語:C言語,開発環境:Visual Studio2017)
15
14
  #include <winsock2.h>
16
15
  #include <windows.h>
17
16
  #include <stdio.h>
@@ -107,9 +106,9 @@
107
106
  WSACleanup();
108
107
  return 0;
109
108
  }
110
-
111
- ------------------------------------------------------------------------------------------
109
+ ```
112
- RaspberryPi側のソースコード(言語:Python)
110
+ ### RaspberryPi側のソースコード(言語:Python)
111
+ ```
113
112
  #ソケット通信プログラム
114
113
  import socket
115
114
 

2

書式の改善

2021/02/22 09:24

投稿

sk009
sk009

スコア0

title CHANGED
File without changes
body CHANGED
@@ -1,22 +1,29 @@
1
1
  ### 前提・実現したいこと
2
2
  ソケット通信を用いてリアルタイムでグラフを変化させたい
3
3
  現在,私はPC-RaspberryPi間におけるソケット通信プログラムを作成しております。作成したプログラムは,PCからRaspberryPiに数値情報を送り,RaspberryPi側で受け取った数値をグラフにリアルタイムで表示するというものです。
4
- ソースコード以下に示します。
4
+ ソースコード以下のようなっています。
5
5
 
6
- ①PC側のソースコード
6
+ しかし,このプログラムではRaspberryPiは数値情報を1回しか受信できないため,グラフを途中で変化させることができません(図1ようにyの値が一定のグラフしか出力できない)。このプログラムを複数回の送受信ができるように改良し,グラフをリアルタイムで変化させるにはどうすれば良いでしょうか?(図2のようにyの値を変化させたい)
7
7
 
8
- include <winsock2.h>
9
- include <windows.h>
10
- include <stdio.h>
11
- include <conio.h>
12
- pragma warning(disable : 4996)
8
+ 説明が下手で申し訳ありません。よろしくお願いいたします。(現在のプログラムでは1回しか送受信ができないため,図1のようなグラフしか出力できません。これをリアルタイムで複数回の送受信ができるようにし,図2のようなグラフを作成したいです。)
13
9
 
10
+ ![イメージ説明](0906bbc62b2bb82ef1c4b0b28260dc3c.png)
11
+
12
+ ### 該当のソースコード
13
+ ```
14
+ PC側のソースコード(言語:C言語,開発環境:Visual Studio2017)
15
+ #include <winsock2.h>
16
+ #include <windows.h>
17
+ #include <stdio.h>
18
+ #include <conio.h>
19
+ #pragma warning(disable : 4996)
20
+
14
21
  WSADATA wsaData;
15
22
  struct sockaddr_in addr;
16
23
  int sockw;
17
24
 
18
- define IP_ADD_TEMP "0.0.0."//IPアドレステンプレ(同じネットワーク下なら使える)
25
+ #define IP_ADD_TEMP "0.0.0."//IPアドレステンプレ(同じネットワーク下なら使える)
19
- define PORT_TEMP 1234 //PORT番号設定(クライアント/サーバで必ず合わせる)
26
+ #define PORT_TEMP 1234 //PORT番号設定(クライアント/サーバで必ず合わせる)
20
27
 
21
28
  int main()
22
29
  {
@@ -101,18 +108,9 @@
101
108
  return 0;
102
109
  }
103
110
 
104
-
105
-
106
-  
107
-  
108
-  
109
-
110
-
111
-   
112
- ---------------------------------------------------------------------------------- 
111
+ ------------------------------------------------------------------------------------------
113
-
114
- RaspberryPi側のソースコード
112
+ RaspberryPi側のソースコード(言語:Python)
115
- ソケット通信プログラム
113
+ #ソケット通信プログラム
116
114
  import socket
117
115
 
118
116
  host = "127.0.0.1"
@@ -134,51 +132,36 @@
134
132
  clientsock.sendall(s_msg.encode())
135
133
  clientsock.close()
136
134
 
137
- ここから下はグラフ表示プログラム
135
+ #ここから下はグラフ表示プログラム
138
136
  import numpy as np
139
137
  from matplotlib import pyplot as plt
140
138
  import random
141
139
 
142
140
  plt.figure()
143
- x軸の幅を100にする
141
+ #x軸の幅を100にする
144
142
  xlim = [0, 100]
145
143
  X, Y = [], []
146
144
 
147
145
  while True:
148
- 画面をクリア
146
+ #画面をクリア
149
147
  plt.cla()
150
148
  Y.append(int(rcvmsg))
151
149
  X.append(len(Y))
152
- xに100個以上格納されたら
150
+ #xに100個以上格納されたら
153
151
  if len(X) > 100:
154
152
  xlim[0] += 1
155
153
  xlim[1] += 1
156
154
 
157
155
  plt.plot(X, Y)
158
- x軸、y軸方向の表示範囲を設定
156
+ #x軸、y軸方向の表示範囲を設定
159
157
  plt.ylim(-1, 100)
160
158
  plt.xlim(xlim[0], xlim[1])
161
- 描写
159
+ #描写
162
160
  plt.pause(0.1)
163
161
 
164
162
 
165
-
166
-
167
- しかし,このプログラムではRaspberryPi側は数値情報を1回しか受信できないため,グラフを途中で変化させることができません(図1のようにyの値が一定のグラフしか出力できない)。このプログラムを複数回の送受信ができるように改良し,グラフをリアルタイムで変化させるにはどうすれば良いでしょうか?(図2のようにyの値を変化させたい)
168
-
169
- 説明が下手で申し訳ありません。よろしくお願いいたします。(現在のプログラムでは1回しか送受信ができないため,図1のようなグラフしか出力できません。これをリアルタイムで複数回の送受信ができるようにし,図2のようなグラフを作成したいです。)
170
-
171
- ![イメージ説明](0906bbc62b2bb82ef1c4b0b28260dc3c.png)
172
-
173
- ### 該当のソースコード
174
163
  ```
175
- PC側のソースコード(言語:C言語,開発環境:Visual Studio2017)
176
- https://drive.google.com/file/d/1VFgWMK5vqEc7DCI37BsIy_LFUkVkwRpS/view?usp=sharing
177
164
 
178
- RaspberryPi側のソースコード(言語:Python)
179
- https://drive.google.com/file/d/1QL1zc8OgwaFZqbxubHfseH3r312ewFKy/view?usp=sharing
180
- ```
181
-
182
165
  ### 補足情報(FW/ツールのバージョンなど)
183
166
 
184
167
  ここにより詳細な情報を記載してください。

1

書式の改善

2021/02/22 09:02

投稿

sk009
sk009

スコア0

title CHANGED
File without changes
body CHANGED
@@ -4,11 +4,166 @@
4
4
  ソースコードを以下に示します。
5
5
 
6
6
  ①PC側のソースコード
7
- https://drive.google.com/file/d/1VFgWMK5vqEc7DCI37BsIy_LFUkVkwRpS/view?usp=sharing
8
7
 
8
+ include <winsock2.h>
9
+ include <windows.h>
10
+ include <stdio.h>
11
+ include <conio.h>
12
+ pragma warning(disable : 4996)
13
+
14
+ WSADATA wsaData;
15
+ struct sockaddr_in addr;
16
+ int sockw;
17
+
18
+ define IP_ADD_TEMP "0.0.0."//IPアドレステンプレ(同じネットワーク下なら使える)
19
+ define PORT_TEMP 1234 //PORT番号設定(クライアント/サーバで必ず合わせる)
20
+
21
+ int main()
22
+ {
23
+ char buf[40];
24
+ int n, i;
25
+ char aaa[] = "127.0.0.1";
26
+
27
+ // winsock2の初期化
28
+ if (WSAStartup(MAKEWORD(2, 0), &wsaData))
29
+ {
30
+ puts("reset winsock failed");
31
+ return -1;
32
+ }
33
+
34
+ // Server に connect して COMMAND を送信する
35
+
36
+ // ソケットの作成
37
+ sockw = socket(AF_INET, SOCK_STREAM, 0);
38
+ if (sockw == INVALID_SOCKET)
39
+
40
+ {
41
+ puts("make socket failed");
42
+ return -1;
43
+ }
44
+
45
+ // IPアドレス作成(defineを使う場合)
46
+ /*
47
+ char ip_add[30] = IP_ADD_TEMP;
48
+ strcat(ip_add, argv[1]);
49
+ */
50
+
51
+ //IPアドレス作成(すべて打ち込み)
52
+ char ip_add[30];
53
+ for (int i = 0; i < 30; i++)
54
+ ip_add[i] = NULL;
55
+ strcpy_s(ip_add, aaa);
56
+
57
+
58
+ // 接続先指定用構造体の準備
59
+ addr.sin_family = AF_INET;
60
+ addr.sin_port = htons(PORT_TEMP);
61
+ addr.sin_addr.S_un.S_addr = inet_addr(ip_add);
62
+
63
+ // サーバーに接続
64
+ if (connect(sockw, (struct sockaddr*)&addr, sizeof(addr)))
65
+ {
66
+ puts("connect failed");
67
+ return -1;
68
+ }
69
+
70
+ // RaspberryPiに数値情報を送る
71
+ n = send(sockw, "50", strlen("50"), 0);
72
+ if (n < 0)
73
+ {
74
+ puts("send failed");
75
+ return -1;
76
+ }
77
+
78
+ // サーバーからデータを受信
79
+ memset(buf, 0, 40);
80
+ n = recv(sockw, buf, 40, 0);
81
+ if (n < 0)
82
+ {
83
+ puts("recv failed");
84
+ return -1;
85
+ }
86
+
87
+ puts(buf);
88
+
89
+ while (1) {
90
+ if (kbhit() != 0)
91
+ {
92
+ break;
93
+ }
94
+ }
95
+
96
+ // ソケットのクローズ
97
+ closesocket(sockw);
98
+
99
+ // winsock2 の終了処理
100
+ WSACleanup();
101
+ return 0;
102
+ }
103
+
104
+
105
+
106
+  
107
+  
108
+  
109
+
110
+
111
+   
112
+ ---------------------------------------------------------------------------------- 
113
+
9
114
  ②RaspberryPi側のソースコード
115
+ ソケット通信プログラム
10
- https://drive.google.com/file/d/1QL1zc8OgwaFZqbxubHfseH3r312ewFKy/view?usp=sharing
116
+ import socket
11
117
 
118
+ host = "127.0.0.1"
119
+ port = 1234
120
+
121
+ serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
122
+ serversock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
123
+ serversock.bind((host,port)) #IPとPORTを指定してバインドします
124
+ serversock.listen(10) #接続の待ち受けをします(キューの最大数を指定)
125
+
126
+ print('Waiting for connections...')
127
+ clientsock, client_address = serversock.accept() #接続されればデータを格納
128
+
129
+ for i in range ( 1 ):
130
+ rcvmsg = clientsock.recv(1024).decode()
131
+ print('Received : %s' % (rcvmsg))
132
+ s_msg = "def"
133
+ print('Send : %s' % s_msg)
134
+ clientsock.sendall(s_msg.encode())
135
+ clientsock.close()
136
+
137
+ ここから下はグラフ表示プログラム
138
+ import numpy as np
139
+ from matplotlib import pyplot as plt
140
+ import random
141
+
142
+ plt.figure()
143
+ x軸の幅を100にする
144
+ xlim = [0, 100]
145
+ X, Y = [], []
146
+
147
+ while True:
148
+ 画面をクリア
149
+ plt.cla()
150
+ Y.append(int(rcvmsg))
151
+ X.append(len(Y))
152
+ xに100個以上格納されたら
153
+ if len(X) > 100:
154
+ xlim[0] += 1
155
+ xlim[1] += 1
156
+
157
+ plt.plot(X, Y)
158
+ x軸、y軸方向の表示範囲を設定
159
+ plt.ylim(-1, 100)
160
+ plt.xlim(xlim[0], xlim[1])
161
+ 描写
162
+ plt.pause(0.1)
163
+
164
+
165
+
166
+
12
167
  しかし,このプログラムではRaspberryPi側は数値情報を1回しか受信できないため,グラフを途中で変化させることができません(図1のようにyの値が一定のグラフしか出力できない)。このプログラムを複数回の送受信ができるように改良し,グラフをリアルタイムで変化させるにはどうすれば良いでしょうか?(図2のようにyの値を変化させたい)
13
168
 
14
169
  説明が下手で申し訳ありません。よろしくお願いいたします。(現在のプログラムでは1回しか送受信ができないため,図1のようなグラフしか出力できません。これをリアルタイムで複数回の送受信ができるようにし,図2のようなグラフを作成したいです。)