memorandums

日々の生活で問題解決したこと、知ってよかったことなどを自分が思い出すために記録しています。

Arduino + Unityでシリアル通信するときにタイムアウトエラーが出る

またまたこれ。

memorandums.hatenablog.com

こちらの記事の以下のコード部分でReadLineメソッドでタイムアウトになっているようです。

    private void Read()
    {
        while (isRunning_ && serialPort_ != null && serialPort_.IsOpen) {
            try {
                message_ = serialPort_.ReadLine(); //★ここ
                isNewMessageReceived_ = true;
            } catch (System.Exception e) {
                Debug.LogWarning(e.Message);
            }
        }
    }

修正方法は以下にありました。

stackoverflow.com

タイムアウト上限をもっと大きくすればよい、という解決方法のようです。マシンによっては(恐らく低電力マシン)シリアル通信にかける電力を落とすためスピードを下げているのかもです。

修正場所は上のQiitaのコードでいうと以下です。

    private void Open()
    {
        serialPort_ = new SerialPort(portName, baudRate, Parity.None, 8, StopBits.One);
        serialPort_.Open();

        serialPort_.ReadTimeout = 5000;  //★ここを追加

        isRunning_ = true;

        thread_ = new Thread(Read);
        thread_.Start();
    }

同じことを続けていると色々なケースがありますね。ソフトウェア開発の複雑さの1つですな。ソフトウェアに変更がなくても周囲が変化するので動かなくなるあれです。

でわ。