0

まず第一に、私はプログラミングがあまり得意ではなく、自分のコードでできる限り説明的であるように努めてきました。シンプルなカスタムメイドの IR モデムを使用して、ユーザーがシリアル ポート経由でメッセージをチャット (受信および送信) できるようにするプログラムを作成しようとしています。私はモデムを構築し、ターミナルやその他の既に作成されたプログラム (つまり Tera Term) を使用する代わりに、独自の単純なプログラムを作成しようとしています。ところで、私は Windows 7 を使用しており、Microsoft Visual Express 2010 環境を使用しています。

このサイトのチュートリアルに基づいて、以下のコードを作成しました。(念のためここに置いておきます) シリアルポートのMSDN

問題 (現在) コンボ ボックス cmbComPort は、コンピューターで使用可能なポートを認識していないようです。おそらく何もないのではないかと思いました!ということで調べてみたところ、こちらが見つかりました。これに基づいて、私のコンピュータにはシリアル ポートがあり、これが問題の原因ではないと思います (よくわからないので、別の方法で教えてください)。デバッグを実行すると、エラー メッセージが表示されました。次に、プログラムをビルドしてテストします。両方のエラー メッセージを以下に添付します

質問 1. 以下のコードは、利用可能なポートをキャッチして myPort 配列に保存していないようです。

'procedure to detect all available ports and store them in the myPort array
    For Each port_name As String In IO.Ports.SerialPort.GetPortNames
        Dim myPort As New IO.Ports.SerialPort(port_name)
        If myPort.IsOpen = True Then
            cmbComPort.Items.Add(port_name)
        End If
    Next

ポート自体に問題があり、検出されなかったのではないかと思いました。しかし、以下のコードを使用して、COM1 が存在し、動作していることを確認できました。

Imports System
Imports System.IO.Ports

Module SerialPortExample

Sub Main()
' Get a list of serial port names. 
Dim ports As String() = SerialPort.GetPortNames()

Console.WriteLine("The following serial ports were found:")

' Display each port name to the console. 
Dim port As String 
For Each port In ports
    Console.WriteLine(port)
Next port

Console.ReadLine()

End Sub 
End Module

コンソール出力は次のとおりです-

次のシリアル ポートが見つかりました: COM1

だから、ポートはそこにあります。問題はおそらくコードのこの部分にあります(とにかく完全にはわかりません)?

'procedure to detect all available ports and store them in the myPort array
For Each port_name As String In IO.Ports.SerialPort.GetPortNames
    Dim myPort As New IO.Ports.SerialPort(port_name)
    cmbComPort.Items.Add(port_name)
Next

この行の後に myPort 配列の内容を確認できる方法はありますか? cmbComPortのアイテムと同様に?

もう1つ、これは追加機能を受け入れるプロジェクトです(自分のプログラムを書くことは間違いなくその1つです)。シリアル ポート通信に関連するものであれ、プログラム インターフェイス自体に関連するものであれ、機能に関するアイデアをお寄せいただければ幸いです。チャットをファイルに保存する、チャット ファイルをロードする、ヘルプ/チュートリアル ファイルを読み込むなど、いくつか考えられますが、上記のエラーを見つけたら、すべて実装する必要があります。さらに、プレーンなリッチ テキスト ボックスの代わりに「バブル チャット」を描画して会話を表示できる方法はあるのでしょうか。それはいいね。

前もって感謝します!:D プロジェクトファイル

コード:

'Chatty Raffy Version 1.3
'This is a simple program to demonstrate Serial Ports communication via a simple custom made IR Modem. 

Imports System
Imports System.ComponentModel
Imports System.Threading
Imports System.IO.Ports

Public Class frmMain

Dim myPort As Array  'an array to store list of available ports

Delegate Sub SetTextCallback(ByVal [text] As String) 'Added to prevent threading errors during receiveing of data

Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)

    'Fill up the cmbBaudRate Combo box to common baud rates used
    cmbBaudRate.Items.Add(9600)
    cmbBaudRate.Items.Add(19200)
    cmbBaudRate.Items.Add(38400)
    cmbBaudRate.Items.Add(57600)
    cmbBaudRate.Items.Add(115200)

    'procedure to detect all available ports and store them in the myPort array
    For Each port_name As String In IO.Ports.SerialPort.GetPortNames
        Dim myPort As New IO.Ports.SerialPort(port_name)
        If myPort.IsOpen = True Then
            cmbComPort.Items.Add(port_name)
        End If
    Next

    'initiate the combo boxes
    cmbComPort.SelectedIndex = 0  'set cmbComPort text to the first COM port detected
    cmbBaudRate.SelectedIndex = 0    'set cmbBaudRate text to the first Baud rate on the list
    cmbParity.SelectedIndex = 0    'set cmbParity text to the first Baud rate on the list
    cmbStopBit.SelectedIndex = 0    'set cmbStopBit text to the first Baud rate on the list

    'btnDisconnect.Enabled = False   'disable the disconnect button

End Sub

'open the selected serial port and start the connection
Private Sub btnConnect_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click
    SerialPort1.PortName = cmbComPort.Text      'set Serial Port to the selected COM port 
    SerialPort1.BaudRate = cmbBaudRate.Text      'set Baud rate to the selected value Baud rate
    SerialPort1.Parity = cmbParity.Text     'set parity setting to the selected value 
    SerialPort1.StopBits = cmbStopBit.Text  'set stop bit setting to the selected value

    SerialPort1.DataBits = 8    'use the default 8 bit for data bit length

    SerialPort1.Open()      'open the chosen serial port

    btnConnect.Enabled = False      'disable the Connect button
    btnDisconnect.Enabled = True    'enable the Disconnect button
    picboxDisconnect.Visible = False 'disable the disconnect picture
    picboxConnect.Visible = True 'enable the disconnect picture
End Sub


'close the serial port currently in used, hence closing the connection
Private Sub btnDisconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisconnect.Click
    SerialPort1.Close()     'close the used Serial Port

    btnConnect.Enabled = True  'esable the Connect button
    btnDisconnect.Enabled = False  'disable the Disconnect button
    picboxDisconnect.Visible = True 'enable the 'disconnect' picture
    picboxConnect.Visible = False 'disable the 'connect' picture
End Sub

'send the text contained in the txtText to the serial port in ASCII using the 'SEND' key
Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    SerialPort1.Write(txtTransmit.Text & vbCr)
End Sub


'detect data at the serial port and call ReceivedText automatically 
Private Sub SerialPort1_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs)
    ReceivedText(SerialPort1.ReadExisting())
End Sub


'read incoming messages at serial port once data is detected
Private Sub ReceivedText(ByVal [text] As String)
    'compare the ID of the Creating Thread to the ID of the Calling Thread
    If Me.rtbReceived.InvokeRequired Then
        Dim x As New SetTextCallback(AddressOf ReceivedText)
        Me.Invoke(x, New Object() {(text)})
    Else
        Me.rtbReceived.Text &= [text]
    End If
End Sub



'this section prevents user from making any changes to the current connection without disconnecting

Private Sub cmbComPort_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
    If SerialPort1.IsOpen = False Then
        SerialPort1.PortName = cmbComPort.Text
    Else
        'pop an error message if user try to change port without closing the current port in use
        MsgBox("Please close the currently used port before making any changes to the connection setting", vbCritical)
    End If
End Sub


Private Sub cmbBaudRate_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbBaudRate.SelectedIndexChanged
    If SerialPort1.IsOpen = False Then
        SerialPort1.BaudRate = cmbBaudRate.Text
    Else
        'pop an error message if user try to change Baud rate without closing the current port in use
        MsgBox("Please close the currently used port before making any changes to the connection setting", vbCritical)
    End If
End Sub

Private Sub cmbParity_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbBaudRate.SelectedIndexChanged
    If SerialPort1.IsOpen = False Then
        SerialPort1.Parity = cmbParity.Text
    Else
        'pop an error message if user try to change Baud rate without closing the current port in use
        MsgBox("Please close the currently used port before making any changes to the connection setting", vbCritical)
    End If
End Sub

Private Sub cmbStopBit_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmbBaudRate.SelectedIndexChanged
    If SerialPort1.IsOpen = False Then
        SerialPort1.StopBits = cmbStopBit.Text
    Else
        'pop an error message if user try to change Baud rate without closing the current port in use
        MsgBox("Please close the currently used port before making any changes to the connection setting", vbCritical)
    End If
End Sub

End Class
4

1 に答える 1

-1

以前、ポートが「開いている」または「閉じている」という意味を誤解していて、友人に指摘されました。それ以来、コードのその部分を

    'procedure to detect all available ports and store them in the myPort array
    For Each port_name As String In IO.Ports.SerialPort.GetPortNames
    Dim myPort As New IO.Ports.SerialPort(port_name)
        cmbComPort.Items.Add(port_name)
    Next

@hans : 実際、この回路は、ラボのコンピューターでターミナル IR モデム (Windows に付属) を使用して既に動作しています。そして、このコードを使用して、実際にシリアルポートが終了して機能していることを確認しました

Imports System
Imports System.IO.Ports

Module SerialPortExample

Sub Main()
    ' Get a list of serial port names. 
    Dim ports As String() = SerialPort.GetPortNames()

    Console.WriteLine("The following serial ports were found:")

    ' Display each port name to the console. 
    Dim port As String 
    For Each port In ports
        Console.WriteLine(port)
    Next port

    Console.ReadLine()

End Sub 
End Module

コンソール出力は次のとおりです-

次のシリアル ポートが見つかりました: COM1

だから、ポートはそこにあります。問題はおそらくコードのこの部分にあります(とにかく完全にはわかりません)?

'procedure to detect all available ports and store them in the myPort array
    For Each port_name As String In IO.Ports.SerialPort.GetPortNames
        Dim myPort As New IO.Ports.SerialPort(port_name)
        cmbComPort.Items.Add(port_name)
    Next

この行の後に myPort 配列の内容を確認できる方法はありますか? cmbComPortのアイテムと同様に?

于 2012-08-15T20:01:14.297 に答える