前提・実現したいこと
https://kondo-robot.com/faq/serial-servo-method-tech-4
これを見ながらvisual basicでサーボを動かすシステムを作っていました。
スタートアップオブジェクトがSub Mainなっていたので、Form1にして実行したところ、エラーメッセージが発生しました。また、変える前も同じエラーが発生しました。
発生している問題・エラーメッセージ
System.InvalidOperationException: 'Instance is read-only.'
該当のソースコード
VB
1Public Class Form1 2 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 3 SerialPort1.Close() 'いったんポートを閉じる 4 If ComboBox1.Text <> String.Empty Then 'COMポート名が空っぽでなかったら(正しく選択されていた場合) 5 SerialPort1.PortName = ComboBox1.Text 'ポート名を指定する 6 SerialPort1.Open() 'ポートを開く(接続する) 7 End If 8 End Sub 9 10 Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged 11 ComboBox1.Items.Clear() 'ComboBoxメニューの中身をいったん削除する 12 ComboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames()) '接続中の全COMポート名をメニューに追加する 13 End Sub 14 15 Private Sub TrackBar1_ValueChanged(sender As Object, e As EventArgs) Handles TrackBar1.Scroll 16 Dim Pos As Integer 'サーボから返ってきたデータを保存するための変数 17 If SerialPort1.IsOpen = True Then 'COMポートが接続済みである場合だけ処理を行う 18 Pos = SetPos(NumericUpDown1.Value, TrackBar1.Value) 'SetPosコマンドにID番号とTrackBarの位置(ポジション)を送る 19 If Pos <> -1 Then 'モーターがきちんと動作した場合 20 TextBox1.Text = Pos.ToString() '受け取った現在位置データを文字列に変換して、TextBoxコントロールに表示する 21 End If 22 End If 23 End Sub 24 25 Private Function SetPos(ByVal Id As Integer, ByVal Pos As Integer) As Integer 26 Dim Tx(3) As Byte 'unsigned char Tx[3] 27 Dim Rx(6) As Byte 'unsigned char Rx[6](ループバックを含む) 28 Dim Dat As Integer 'int Dat 29 Dim Flag As Boolean = True '正しくデータが受け取れたかチェックするフラグ 30 31 Tx(0) = &H80 Or Id 'Tx[0] = 0x80 | id 32 Tx(1) = Pos >> 7 And &H7F 'Tx[1] = (pos >> 7) & 0x7F 33 Tx(2) = Pos And &H7F 'Tx[2] = pos & 0x7F 34 35 SerialPort1.DiscardInBuffer() 'いったんバッファをクリアする 36 SerialPort1.DiscardOutBuffer() 37 38 SerialPort1.Write(Tx, 0, 3) 'Tx配列(ICSコマンド)をシリアルポートから出力する 39 40 For i As Integer = 0 To 5 Step 1 '1バイト受信を6回繰り返します 41 Try 'データを1バイト受信する 42 Rx(i) = CType(SerialPort1.ReadByte(), Byte) 'CTypeは型変換関数 43 Catch ex As Exception '何かしらの理由で受信失敗 44 Flag = False 45 Exit For 'ループは終了する 46 End Try 47 Next 48 49 If Flag = False Then '受信に失敗したので-1を返す 50 SetPos = -1 '関数名に値を代入すると値を返して関数終了 51 End If 52 53 Dat = CType(Rx(4), Integer) 'データを元に戻す 54 Dat = (Dat << 7) + CType(Rx(5), Integer) 55 56 SetPos = Dat '関数名に値を代入すると値を返して関数終了 57 58 End Function 59End Class 60 61'Sub Mainから変える前の残骸、変える前も同じ症状が出た 62Module mainModule 63 <STAThread()> 64 Sub Main() 65 Dim _form1 As New Form1() 66 Application.Run(_form1) ' エラー箇所 _form1.ShowDialog()でも同じ 67 End Sub 68End Module
補足情報
VisualStudio 2019の最新版を使っています。
ターゲットフレームワークは.NET Core 3.1です
スタートオブジェクトを"Form1"に指定した場合
「お使いのアプリはブレーク状態になりましたが、すべてのスレッドが外部コード (通常はシステム コードまたはフレームワーク コード) を実行していたため、表示されるコードはありません。」
という画面が出ます。
Sub Mainににした場合は、65行目付近の
Application.Run(_form1)
で出ます。
おそらく今回のエラーとは関係ないと思いますが、ここを元にSerialPortを追加しています。
サーボ動かすために始めた初心者なので、とても簡単なやつをやろうと思い、ボタンを押したらボタンのテキストが変わるというのを作り、Form1からスタートするようにしたところできました。逆にできてしまったので、絶対わからないだろうなと思い質問させていただきました。
また、ここを参考にShowDialogでやっても同じエラーが出ました
回答1件
あなたの回答
tips
プレビュー