2

<mccon>各ポートを開いてシリアルに送信しようとしています。これに対してマイクロコントローラーが応答<connected>\nし、その後 C# コードが for each ループを終了する必要があります。

回線で困っていserialPort.PortName = str;ます。2 回繰り返した後、それ以上続行しません。

これも手動でやってみました。ドロップダウンを作成し、ポートを 1 つずつ選択しました。2 番目のポート以降は、シリアル ポートを変更できません。しかし、2 回以内に選択した場合、問題なく動作します。

私は C++ の OOP を知っています。しかし、私はC#が初めてです。ループが失敗する理由がわかりません。

public Form1()
{
    InitializeComponent();
    send_button.Enabled = false;

    //Availabe COM ports
    SerialPort tmp;
    foreach(string str in SerialPort.GetPortNames())
    {
        tmp = new SerialPort(str);
        if (tmp.IsOpen == false)
        {
            serialPort.PortName = str;

            try
            {
                //Open serial port
                serialPort.Open();
                serialPort.BaudRate = 9600;
                serialPort.WriteTimeout = 10;
                serialPort.ReadTimeout = 10;
                serialPort.Write("<mccon>");
                readtxt.Text = serialPort.ReadTo("\n");
                if (readtxt.Text == "<connected>")
                {
                    send_button.Enabled = true;
                    port_combobox.Enabled = false;
                    break;
                }
                else
                {
                    serialPort.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}
4

2 に答える 2

2

複数のシリアル ポートはありませんが、コードをコンパイルして実行すると、読み取り中にエラーが発生した場合にシリアル ポートを閉じていないことに気付きました。次のようにコードを変更することをお勧めします。

        SerialPort tmp;
        foreach (string str in SerialPort.GetPortNames())
        {
            tmp = new SerialPort(str);
            if (tmp.IsOpen == false)
            {

                serialPort.PortName = str;

                try
                {
                    //open serial port
                    serialPort.Open();
                    serialPort.BaudRate = 9600;
                    serialPort.WriteTimeout = 10;
                    serialPort.ReadTimeout = 10;
                    serialPort.Write("<mccon>");
                    String s = serialPort.ReadTo("\n");
                    if (s == "<connected>")
                    {
                        break;
                    }
                    else
                    {
                        serialPort.Close();
                    }
                }
                catch (TimeoutException)
                {
                    serialPort.Close();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }

開いている間にポート名を変更した場合の影響はわかりませんが、表示されている問題が発生する可能性があります。

于 2013-02-13T15:30:26.480 に答える
0

このコードを実行して、それが示すものを返していただけますか? シリアルポートに使用できるArduinoポートに関する情報が表示される場合があります。

への参照をSystem.Management追加し、使用も追加してから、コードを試してください。

using System.Management;

try
{
    ManagementObjectSearcher searcher =
        new ManagementObjectSearcher("root\\CIMV2",
                                     "SELECT * FROM Win32_PnPEntity");

    foreach (ManagementObject queryObj in searcher.Get())
    {
        if (queryObj["Caption"].ToString().ToUpper().Contains("ARDUINO"))
        {
            Console.WriteLine(queryObj["Caption"]);
            foreach (PropertyData pd in queryObj.Properties) { Console.WriteLine(pd.Name + " : " + pd.Value); }
        }
    }
}
catch (ManagementException e)
{
    Console.WriteLine(e.Message);
}
Console.ReadKey();
于 2013-02-13T15:36:21.437 に答える