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

回答編集履歴

2

回答の修正

2018/03/14 23:48

投稿

y_waiwai
y_waiwai

スコア88182

answer CHANGED
@@ -4,8 +4,10 @@
4
4
 
5
5
  RowSerialクラスというのはどうやらビジーループを使った送受信ユニットのようです
6
6
  これは、他の処理で受信操作の実行が遅れると取りこぼしが発生します
7
+ まず、他の処理をコメントアウトし、MIDI_RXルーチンだけを無限ループで実行させ、取りこぼしが出るかどうかを見てみてください。
7
8
 
9
+ これで取りこぼしがなく、その他の処理を入れると取りこぼしが発生するという場合は、
8
- 対策としては、他の時間のかかる処理を分割して、取りこぼしが発生する時間間隔より早い周期で受信操作(リングバッファの格納)を行う必要があります
10
+ の処理を分割して、取りこぼしが発生する時間間隔より早い周期で受信操作(リングバッファの格納)を行う必要があります
9
11
  そこらへんの対策はオシロスコープなどで、どこで時間がかかるか、どこで分割するかというのを見ていく必要があります
10
12
 
11
13
  それができない、という場合は、シリアルポートの送受信ルーチンを割り込み対応として作り直すってことになってしまいますね。

1

回答の修正

2018/03/14 23:48

投稿

y_waiwai
y_waiwai

スコア88182

answer CHANGED
@@ -1,5 +1,5 @@
1
- ちと気になるところとしては、
1
+ 取りこぼしとは関係ないですが、ちと気になるところとしては、
2
- これとは別に、MIDI_Rxルーチンで、いきなりmidi.getcを呼んでいますが、受信データが来ていない場合はここで待ちに入ってしまいます
2
+ MIDI_Rxルーチンで、いきなりmidi.getcを呼んでいますが、受信データが来ていない場合はここで待ちに入ってしまいます
3
3
  ここはまず、受信データが有るかどうかを判断し、ない場合は以下の処理をパスするようにするほうがベストですね
4
4
 
5
5
  RowSerialクラスというのはどうやらビジーループを使った送受信ユニットのようです