質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

1回答

2800閲覧

windowフォームアプリでApplication.Run()ができない

_nb_eri_

総合スコア4

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

0クリップ

投稿2021/11/07 10:55

編集2021/11/07 14:25

前提・実現したいこと

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 &gt;&gt; 7) &amp; 0x7F 33 Tx(2) = Pos And &H7F 'Tx[2] = pos &amp; 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でやっても同じエラーが出ました

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/11/07 12:27

どの行でエラーが出たんでしょうか
cx20

2021/11/07 12:33

環境が不明な為、下記の記載をお願いします。 ・Visual Studio のバージョン ・.NET Framework のバージョン(ターゲットフレームワーク)
guest

回答1

0

ベストアンサー

■ シリアルサーボ制御方法(5) PCから直接制御編(その2)
https://kondo-robot.com/faq/serial-servo-method-tech-5

のページの最後にサンプルのソースコードがありました。こちらでもエラーになりますか?

■ Visual Basic のソースコード 
https://kondo-robot.com/w/wp-content/uploads/IcsSetPosition_VB.zip

投稿2021/11/07 12:27

cx20

総合スコア4633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_nb_eri_

2021/11/07 14:50

返信ありがとうございます。 悩む前に1度やったのですができず、今また試してみたところできました。。。 ありがとうございますm(_ _ )m ただ、前やったときは、「~(覚えてないです、、、)のアップグレードができます」みたいなことを言われそれをせずにやって出来ませんでした。今開いたときはそれが聞かれませんでした。勝手にアップグレードされたのでしょうか。
cx20

2021/11/07 15:12

再現性がないとトラブルシューティングは厳しいですね。。 .NET Core 3.1 でプロジェクト作ってみましたが、エラーは再現しないようでした。 最近の .NET 動向をあまり追っていないのですが、 .NET Core 3.1 では SerialPort を標準サポートしていないようなので、.NET Framework にしておいた方が無難そうな気はします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問