シリアル通信 への返答

投稿で使用できる特殊コードの説明。(別タブで開きます。)
本名は入力しないようにしましょう。
投稿した後で削除するときに使うパスワードです。返答があった後は削除できません。
返答する人が目安にします。相手が小学生か社会人かで返答の仕方も変わります。
最初の投稿が質問の場合、質問者が解決時にチェックしてください。(以降も追加書き込み・返信は可能です。)
※「過去ログ」について書くときはその過去ログのURLも書いてください。

以下の返答は逆順(新しい順)に並んでいます。

投稿者 vb素人  (社会人) 投稿日時 2017/3/13 16:06:07
YuOさま

お騒がせしてすみません。
通信速度の設定が間違えていました。
2400に設定しておりました。

9600に変更した所、①と②で同じデータが受信できることを確認しました。
本当にすみません。
投稿者 vb素人  (社会人) 投稿日時 2017/3/10 17:00:25
YuOさま

説明が下手で申し訳ありません。
①と②の違いについて、説明を追加させていただきます。


①PC(vb)-Xbee(Router)
vbで通信アプリを作成しました。
送信データを入力するTextbox1と、送信ボタン。
送信ボタンのイベントハンドラー内のコードを掲載させていただきました。

このとき、
PCとXbeeはUSBケーブルで接続されていますが、
Xbeeが接続されているCOMポートは、vbで作成した通信アプリと接続しています。

受信側のXbeeのみ「XCTU」の画面上に追加して、受信データをモニタしています。


②Xbee(Coordinator)-Xbee(Router)

②は、「XCTU」の画面に、Coordinator側も追加しています。
Coordinator(送信側)Xbeeからのデータ送信は、「XCTU」で行っています。
投稿者 YuO  (社会人) 投稿日時 2017/3/8 16:22:16
根本として,①のPCとZigbee Routerの間の通信はどうやっているのでしょうか。
普通に考えるとコーディネーターに設定されたXBeeモジュールが入っていて,それとプログラムが通信しているはずなのですが……。
そして,②との違いがわからない……。


で,過去にSerialPortクラスを使ってXBeeモジュールと通信した事がありますが,文字化けはなかったですね……。

調べるとすれば,
・XBeeの各種パラメータは正しいか
・sdatは正しいデータか
・SerialPort1.EncodingにEncoding.GetEncoding("SHIFT_JIS")を入れた状態で,Write(TextBox1.Text)としたら送られるデータはどうなるか
あたりでしょうか。

ちなみに,私が通信用にお試しとして使ったコードは,以下のC#コンソールアプリケーションコードです。
これを送信側・受信側ともにコーディネーターとして設定し,双方が通信できるように設定した上で,
受信側と送信側双方で同じプログラムをチャット的に使いました(透過モード専用です)。
# VS 2015
using System;
using System.IO.Ports;
using System.Text;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        var portNames = SerialPort.GetPortNames();
        if (portNames.Length == 0)
        {
            Console.WriteLine("シリアルポートが見つかりませんでした。");
            return;
        }
        for (int i = 0; i < portNames.Length; ++i)
        {
            Console.WriteLine($"{i + 1} : {portNames[i]}");
        }
        int portIndex;
        while (true)
        {
            Console.Write("ポートを選択してください >");
            var s = Console.ReadLine();
            if (s == null)
            {
                return;
            }
            if (Int32.TryParse(s, out portIndex) && 1 <= portIndex && portIndex <= portNames.Length)
            {
                break;
            }
        }
        using (var port = new SerialPort(portNames[portIndex - 1])
        {
            BaudRate = 9600,
            DataBits = 8,
            Parity = Parity.None,
            StopBits = StopBits.One,
            Handshake = Handshake.None,
            NewLine = "\r",
            Encoding = Encoding.UTF8
        })
        {
            port.Open();

            var sendTask = Task.Factory.StartNew(() =>
            {
                string line;
                while ((line = Console.ReadLine()) != null)
                {
                    port.WriteLine(line);
                }
            });
            var receiveTask = Task.Factory.StartNew(() =>
            {
                string line;
                while ((line = port.ReadLine()) != null)
                {
                    Console.WriteLine(line);
                }
            });
            Task.WhenAny(sendTask, receiveTask).Wait();
        }
    }
}
投稿者 vb素人  (社会人) 投稿日時 2017/3/8 14:25:54
すみません。コードを間違えておりました。
Textbox1の中身をstrSendに代入した状態でテストしています。

そのうえでの質問です。
[質問]
TextBoxに入力されたアルファベット「u」を送信したところ、
受信データは、F8 F8 80 となってしまいます。


失礼しました。

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

        '送信データを文字列型strSendで宣言
        Dim strSend As String
        '送信データが未入力の場合の処理
        If TextBox1.Text.Length = 0 Then
            MessageBox.Show("送信文字列を入力してください", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
            TextBox1.Focus()
            Exit Sub
        End If

        'TextBox1に入力されたデータを送信データとする
        strSend = TextBox1.Text

        Try
            '文字列の送信
            Dim sdat() As Byte = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetBytes(strSend)
            SerialPort1.Write(sdat, 0, sdat.GetLength(0))


        Catch ex As Exception
            MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub 
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/3/7 15:49:02
> ①の送信は、次のコードで行っています。

TextBox1.Text の内容を変数 strSend に代入しなくて良いのでしょうか?
変数 strSend には値が代入されておらず、Nothing のままのようですが…。
投稿者 vb素人  (社会人) 投稿日時 2017/3/7 12:58:32
次の2つの方法でデータ送受信の確認テストを行っています。

①PC(vb)-Xbee(Router)
②Xbee(Coordinator)-Xbee(Router)

①で送信するときのデータについて教えてください。
TextBoxに入力されたアルファベット「u」を送信したところ、
受信データは、F8 F8 80 となってしまいます。

②で「u」を送信したら、受信データが「75」と表示されます。


①の送信は、次のコードで行っています。
なぜ、①の送信プログラムで、受信データが「75」とならないのでしょうか。
    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click

        '送信データを文字列型strSendで宣言
        Dim strSend As String
        '送信データが未入力の場合の処理
        If TextBox1.Text.Length = 0 Then
            MessageBox.Show("送信文字列を入力してください", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
            TextBox1.Focus()
            Exit Sub
        End If



        Try
            '文字列の送信
            Dim sdat() As Byte = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetBytes(strSend)
            SerialPort1.Write(sdat, 0, sdat.GetLength(0))


        Catch ex As Exception
            MessageBox.Show(ex.Message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
    End Sub