シリアル通信 への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 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」で行っています。
説明が下手で申し訳ありません。
①と②の違いについて、説明を追加させていただきます。
①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
普通に考えるとコーディネーターに設定された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
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 のままのようですが…。
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
①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
お騒がせしてすみません。
通信速度の設定が間違えていました。
2400に設定しておりました。
9600に変更した所、①と②で同じデータが受信できることを確認しました。
本当にすみません。