「PIC AVR 工作室」サイトの日記的なブログです。
サイトに挙げなかった他愛ないことを日記的に書き残してます。
PIC AVR 工作室 ブログ



MIDI機器→シリアル変換のテストをしていて、
市販のUSB-シリアル変換ケーブルだと上手く
動くのにFT232RLだと上手く行かないという不可解
な事象がおきてたわけですが、uさんから頂いた
情報でとりあえず解消しました。
http://brown.ap.teacup.com/nekosan0/793.html#comment

どうやら、FT232RLドライバの設定が原因になっている
ようです。上記の日のブログコメントに書いたとおり
原因はよく解ってないのですが、ドライバの設定画面
を開いて

そこからさらにAdvancedを開いて

latency timerを1msにしたら何の問題もなく
上手く動くようになりました。

どこらへんに境目があるのかよくわかりませんが、
程ほどのレイテンシに設定すると良いようです。

一方、何が根本的な原因なのかは今のところ
解ってません…
こまめにパケットを送らないとフン詰まりになる
ってことなんだろうなぁ…って気がするんだけど、
なぜそうなっちゃうのかとか、どの程度で
フン詰まりになっちゃうのかとか、その辺が…

まぁ、原因がVBのプログラムでもtiny2313の
ファームでも無さそうだということは判りました。
ひとまず安心といった感じ。



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする




というわけで、FT232RLで上手く動いていない状態
のソース該当部分を貼ってみます。


'*************************************
'***** definition serial port *****
'***** & procedure declaration *****
'*************************************


Delegate Sub AddDataDelegate(ByVal b As Byte)

Private Sub AddData(ByVal b As Byte)

Dim b2hex As String


If ((Me.omit_ACTIVE_SENSING.Checked = True) And (b = &HFE) _
Or (Me.omit_TIMING_CLOCK.Checked = True) And (b = &HF8)) Then
'omit ACTIVE SENSING or TIMING CLOCK
'do noting
Else
If (b >= &H80) Then 'status byte?
If (b <> &HFE And b <> &HF8) Then
input_message.AppendText(ControlChars.CrLf)
Else
input_message.AppendText(" ")
End If
Else
input_message.AppendText(" - ")
End If

b2hex = Microsoft.VisualBasic.Right("0" + Hex(b), 2)
input_message.AppendText(b2hex)
End If

End Sub


Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort1.DataReceived

Dim bDataReceived As Byte
Dim addr As New AddDataDelegate(AddressOf AddData)
Try
bDataReceived = SerialPort1.ReadByte
Catch ex As Exception
bDataReceived = ex.Message
End Try
input_message.Invoke(addr, bDataReceived)

End Sub



簡単な概要を補足。

シリアルからDataReceivedハンドラで1バイト単位
でデータを受け取って、invokeでAddDataサブを
呼び出すようにしておいて、データを受け取った際の
処理実体はAddDataサブ側に記述。AddDataサブ側では
バイナリデータをHEXの文字列にしてテキスト
ボックスに追加してます。
(input_message.AppendTextメソッドね)

特にアヤシイ処理はやってないはずなんだけどなぁ…


invokeとdelegateで別スレッドを立てずに、
DataReceivedを受け取ってそのサブルーチン
側で直接処理しちゃえば何とかなるのかな?

そもそもシリアル入力の処理って別スレで
処理しなくても構わないのかな?その辺の
仕様(?)周りが良くわかんないんだよな…


そもそもinvokeとdelegateの周りが良く解ってない
ってことなのかな?

あとで
http://homepage1.nifty.com/MADIA/vb/vb_bbs2/200710/200710_07100071.html
http://blogs.msdn.com/shozoa/archive/2007/07/09/python-workshop-hands-on.aspx
このへんとか読み直してみようか…。



コメント ( 0 )
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする