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

質問編集履歴

7

タイトルの編集

2017/01/08 06:18

投稿

NEWBIEEBIEE
NEWBIEEBIEE

スコア62

title CHANGED
@@ -1,1 +1,1 @@
1
- c++によるXMODEMが送受信できません
1
+ c++によるXMODEM受信関数を作っているが、dataの読み込みする前に終了する
body CHANGED
File without changes

6

デバッグにおける修正

2017/01/08 06:18

投稿

NEWBIEEBIEE
NEWBIEEBIEE

スコア62

title CHANGED
File without changes
body CHANGED
@@ -6,12 +6,16 @@
6
6
  受信側のxmodem_receiveは"Sending C ping..."でファイル送信の合図である'C'を送信側に対しておくることができており、その後、送信側はファイルの送信を行っているようなのですが
7
7
  ![送信側](fc19dd9a69375554f8ef9ddb44aafeeb.png)
8
8
  受信側のxmodem_receiveはそこで終了します。
9
- ![受信側](c782c1b44fff2ff1a474563138dff5e0.png)
9
+ ![受信側](b0f950fa3f99da5fafec4ce52ac0d3dc.png)
10
10
  データの受信を続けたいのですが、
11
- 肝心のデータ受信部分で"Invalid argument"出力されてしまいます
11
+ 肝心のデータ受信部分が動作しません
12
+ データを受け取らずに終了してしまいます。
13
+ プログラムの構成がいけないのでしょうか
14
+ また、STKを
15
+ データから受信する際にprintfで出力したら
16
+ if文の(recSTX == X_STX)で通るにもかかわらず
17
+ ’K’と出てくるのはなぜなのでしょうか。
12
18
 
13
- エラーハンドリングと関数についてのアドバイスの方おねがいします。
14
-
15
19
  ご教授お願いします
16
20
 
17
21
  全体のコードはこちらの最下部にあります(http://stackoverflow.com/questions/41502457/my-implementation-of-xmodem-receiving-function-is-not-working)
@@ -56,7 +60,12 @@
56
60
  fflush(stdout);
57
61
  ret = read(serial_fd, &recSTX, sizeof(recSTX));
58
62
 
63
+
64
+ if(recSTX == X_STX){
59
- printf("STX is %c\n", &recSTX);
65
+ printf("STX is %c\n", &recSTX);
66
+ }else{
67
+ printf("Garabage payload %c\n", &recSTX);
68
+ }
60
69
  fflush(stdout);
61
70
  if (ret != sizeof(recSTX)) {
62
71
  printf("Not working");
@@ -68,14 +77,14 @@
68
77
 
69
78
  //So next, receiving blk
70
79
  ret = read(serial_fd, &recBlk, sizeof(recBlk));
71
- printf("Block Num is %c\n", &recBlk);
80
+ printf("Block Num is %d\n", recBlk);
72
81
  fflush(stdout);
73
82
  if (ret != sizeof(recBlk)) {
74
83
  perror("read");
75
84
  return -errno;
76
85
  }
77
86
  ret = read(serial_fd, &recNegBlk, sizeof(recNegBlk));
78
- printf("Negative Block Num is %c\n", &recNegBlk);
87
+ printf("Negative Block Num is %d\n", recNegBlk);
79
88
  fflush(stdout);
80
89
  if (ret != sizeof(recNegBlk)) {
81
90
  perror("read");
@@ -138,12 +147,20 @@
138
147
  ```
139
148
  main関数
140
149
  ```c++
141
-
142
-
143
150
  int main(int argc, char **argv)
144
151
  {
145
152
  int a, ret, serial_fd;
146
153
 
154
+ printf("STX: %c\n", X_STX);
155
+
156
+ printf("ACK: %c\n", X_ACK);
157
+
158
+ printf("NAK: %c\n", X_NAK);
159
+
160
+ printf("EOF: %c\n", X_EOF);
161
+
162
+ fflush(stdout);
163
+
147
164
  serial_fd = open_serial("/dev/ttyUSB0", 115200);
148
165
  if (serial_fd < 0)
149
166
  return -errno;
@@ -165,4 +182,5 @@
165
182
  return 0;
166
183
  }
167
184
 
185
+
168
186
  ```

5

文章の変更

2017/01/08 05:40

投稿

NEWBIEEBIEE
NEWBIEEBIEE

スコア62

title CHANGED
File without changes
body CHANGED
@@ -8,8 +8,10 @@
8
8
  受信側のxmodem_receiveはそこで終了します。
9
9
  ![受信側](c782c1b44fff2ff1a474563138dff5e0.png)
10
10
  データの受信を続けたいのですが、
11
- 関数のどこらへんおかしいのでしょうか
11
+ 肝心データ受信部分で"Invalid argument"出力されてます
12
12
 
13
+ エラーハンドリングと関数についてのアドバイスの方おねがいします。
14
+
13
15
  ご教授お願いします
14
16
 
15
17
  全体のコードはこちらの最下部にあります(http://stackoverflow.com/questions/41502457/my-implementation-of-xmodem-receiving-function-is-not-working)

4

コードと画像の追記

2017/01/07 08:45

投稿

NEWBIEEBIEE
NEWBIEEBIEE

スコア62

title CHANGED
File without changes
body CHANGED
@@ -4,8 +4,9 @@
4
4
  こちらのコードですが、ここ(https://gist.github.com/zonque/0ae2dc8cedbcdbd9b933)のサイトのコードを元に、xmodem_receiveという関数を新たに実装し,XMODEMのデータ受信をしたいと思っております。
5
5
  作成した関数なのですが、途中で何故か終了してしまいます。
6
6
  受信側のxmodem_receiveは"Sending C ping..."でファイル送信の合図である'C'を送信側に対しておくることができており、その後、送信側はファイルの送信を行っているようなのですが
7
- ![イメージ説明](fc19dd9a69375554f8ef9ddb44aafeeb.png)
7
+ ![送信側](fc19dd9a69375554f8ef9ddb44aafeeb.png)
8
8
  受信側のxmodem_receiveはそこで終了します。
9
+ ![受信側](c782c1b44fff2ff1a474563138dff5e0.png)
9
10
  データの受信を続けたいのですが、
10
11
  この関数のどこらへんがおかしいのでしょうか。
11
12
 
@@ -14,6 +15,7 @@
14
15
  全体のコードはこちらの最下部にあります(http://stackoverflow.com/questions/41502457/my-implementation-of-xmodem-receiving-function-is-not-working)
15
16
  わたしが実装した関数
16
17
  ```c++
18
+
17
19
  static int xmodem_receive(int serial_fd, char* filename, int _crc){
18
20
  int skip = 0;
19
21
  uint8_t sdCRC = 'C';
@@ -36,21 +38,27 @@
36
38
  fp = fopen(filename, "wb");
37
39
  //Send NAK still read SOH that header of one data chunks
38
40
  while(1){
41
+ char status;
39
42
  printf("Waiting for sender ping ...");
40
43
  fflush(stdout);
41
44
  //
42
45
  do {
43
46
  if(_crc){
44
- printf("Send C ping....");
47
+ printf("Send C ping....\n");
45
48
  ret = write(serial_fd, &sdCRC, sizeof(sdCRC));
46
49
  }else{
47
50
  // send NAK before read SOH
48
- printf("Send NAK ping....");
51
+ printf("Send NAK ping....\n");
49
52
  ret = write(serial_fd, &sdNAK, sizeof(sdNAK));
50
53
  } // after sending NAK,receiving SOH from chunk
54
+ fflush(stdout);
51
55
  ret = read(serial_fd, &recSTX, sizeof(recSTX));
56
+
57
+ printf("STX is %c\n", &recSTX);
58
+ fflush(stdout);
52
59
  if (ret != sizeof(recSTX)) {
53
60
  printf("Not working");
61
+ fflush(stdout);
54
62
  perror("read");
55
63
  return -errno;
56
64
  }
@@ -58,21 +66,29 @@
58
66
 
59
67
  //So next, receiving blk
60
68
  ret = read(serial_fd, &recBlk, sizeof(recBlk));
69
+ printf("Block Num is %c\n", &recBlk);
70
+ fflush(stdout);
61
71
  if (ret != sizeof(recBlk)) {
62
72
  perror("read");
63
73
  return -errno;
64
74
  }
65
75
  ret = read(serial_fd, &recNegBlk, sizeof(recNegBlk));
76
+ printf("Negative Block Num is %c\n", &recNegBlk);
77
+ fflush(stdout);
66
78
  if (ret != sizeof(recNegBlk)) {
67
79
  perror("read");
68
80
  return -errno;
69
81
  }
70
- ret = read(serial_fd, &recData, sizeof(recData));
82
+ ret = read(serial_fd, (void *)&recData, sizeof(recData));
83
+ printf("Data buffer is %c\n", &recData);
84
+ fflush(stdout);
71
85
  if (ret != sizeof(recData)) {
72
86
  perror("read");
73
87
  return -errno;
74
88
  }
75
89
  ret = read(serial_fd, &recChksum, sizeof(recChksum));
90
+ printf("Check sum is %c", &recChksum);
91
+ fflush(stdout);
76
92
  if (ret != sizeof(recChksum)) {
77
93
  perror("read");
78
94
  return -errno;
@@ -116,10 +132,12 @@
116
132
  return 0;
117
133
 
118
134
  }
135
+
119
136
  ```
120
137
  main関数
121
138
  ```c++
122
139
 
140
+
123
141
  int main(int argc, char **argv)
124
142
  {
125
143
  int a, ret, serial_fd;
@@ -144,4 +162,5 @@
144
162
 
145
163
  return 0;
146
164
  }
165
+
147
166
  ```

3

文法変えた

2017/01/07 08:42

投稿

NEWBIEEBIEE
NEWBIEEBIEE

スコア62

title CHANGED
File without changes
body CHANGED
@@ -3,7 +3,7 @@
3
3
  引き続きよろしくお願いします。
4
4
  こちらのコードですが、ここ(https://gist.github.com/zonque/0ae2dc8cedbcdbd9b933)のサイトのコードを元に、xmodem_receiveという関数を新たに実装し,XMODEMのデータ受信をしたいと思っております。
5
5
  作成した関数なのですが、途中で何故か終了してしまいます。
6
- "Sending C ping..."でファイル送信の合図である'C'を送信側に対しておくることができており、送信側はファイルの送信を行っているようなのですが
6
+ 受信側のxmodem_receiveは"Sending C ping..."でファイル送信の合図である'C'を送信側に対しておくることができており、その後、送信側はファイルの送信を行っているようなのですが
7
7
  ![イメージ説明](fc19dd9a69375554f8ef9ddb44aafeeb.png)
8
8
  受信側のxmodem_receiveはそこで終了します。
9
9
  データの受信を続けたいのですが、

2

タグの追加

2017/01/07 04:45

投稿

NEWBIEEBIEE
NEWBIEEBIEE

スコア62

title CHANGED
File without changes
body CHANGED
File without changes

1

修正

2017/01/07 04:30

投稿

NEWBIEEBIEE
NEWBIEEBIEE

スコア62

title CHANGED
File without changes
body CHANGED
@@ -11,6 +11,7 @@
11
11
 
12
12
  ご教授お願いします
13
13
 
14
+ 全体のコードはこちらの最下部にあります(http://stackoverflow.com/questions/41502457/my-implementation-of-xmodem-receiving-function-is-not-working)
14
15
  わたしが実装した関数
15
16
  ```c++
16
17
  static int xmodem_receive(int serial_fd, char* filename, int _crc){