C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: Visual C# でのXMODEMを用いたシリアル通信


(過去ログ 108 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■64473 / inTopicNo.1)  Visual C# でのXMODEMを用いたシリアル通信
  
□投稿者/ じゅうべい (1回)-(2012/12/04(Tue) 23:38:28)

分類:[C#] 

Visual Studio 2008 C#のserialportクラスを用いてteraterm相手にXMODEMでのファイル転送を行おうとしています。
プログラムはボタンをクリックするとシリアルポートを開けdatバイト配列にデータの中身を格納しシリアル送信するというものです。

 private void button3_Click(object sender, EventArgs e) {
 // シリアルポートのオープン
 serialPort1.PortName = "COM1";
 // シリアルポートの通信速度指定
 serialPort1.BaudRate = 9600;
 // シリアルポートのパリティ指定
 serialPort1.Parity = System.IO.Ports.Parity.None;
 // シリアルポートのビット数指定
 serialPort1.DataBits = 8;
 // シリアルポートのストップビット指定
 serialPort1.StopBits = System.IO.Ports.StopBits.One;
 // シリアルポートのオープン
 serialPort1.Open();
 
 //ファイルを開くダイアログの作成
 OpenFileDialog dlg = new OpenFileDialog();
 //ファイルフィルタ
 dlg.Filter = "CFG形式(*.cfg)|*.cfg|すべてのファイル(*.*)|*.*";
 //ダイアログの表示 (Cancelボタンがクリックされた場合は何もしない)
 if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.Cancel) return;
 //取得したファイル名
 String FileName = dlg.FileName;
 //ファイル名のデータをreaderに格納
 System.IO.FileStream reader = new System.IO.FileStream(FileName, System.IO.FileMode.Open, System.IO.FileAccess.Read);

 Byte[] dat = new byte[132];

  while(true){
  //1ブロックの初めにACK格納
  dat[0] = SOH;
  //2番目にブロックナンバー
  dat[1] = BN;
  //3番目にブロックナンバーの補数
  dat[2] = BNC;
  //データのサイズを確認
  int readSize = reader.Read(dat, 3, 128);
  //データサイズが0ならば
  if (readSize == 0){
dat[0] = EOT;
serialPort1.Write(dat, 0, 1);
     break;
  } 
}

とし。dat[3]にchecksum入れて送りたいのですが計算送信方法を追加する方法がわかりません。
また送信に失敗しNAKを受け取った場合にdataの送信を再度やり直したいのですが、whileのループだと再度送信ではなく続きから送信になってしまいます(readerの1〜128バイト目の送信を失敗した場合1〜128ではなく129〜からになってしまう)。
この二つについて質問をしたいですよろしくお願いします
引用返信 編集キー/
■64475 / inTopicNo.2)  Re[1]: Visual C# でのXMODEMを用いたシリアル通信
□投稿者/ オショウ (45回)-(2012/12/05(Wed) 00:12:23)
モデムを使うのではなく、手動で行うのネ・・・

ttp://ja.wikipedia.org/wiki/XMODEM

当然、XMODEMのプロトコルの仕様は解っているんだよね?!
で、チェックサムの計算方法も決まっている。

検索すればいろいろ出てくるけど、プログラムに加味されて
いないようですが、まずチェックサム計算部分を追記してか
らでしょう!頑張って下さい。

以上。参考まで


引用返信 編集キー/
■64557 / inTopicNo.3)  Re[2]: Visual C# でのXMODEMを用いたシリアル通信
□投稿者/ じゅうべい (3回)-(2012/12/06(Thu) 23:09:51)
2012/12/06(Thu) 23:10:19 編集(投稿者)
2012/12/06(Thu) 23:10:15 編集(投稿者)

オショウさんありがとうございます。自分なりに調べて次のようにしました。

for (int i = 0; i < 128; i++) {
//チェックサム計算
checksum[0] = (byte)(checksum[0] + dat[i]);
}

シリアル通信にてファイルのデータを128バイトずつ送信しているのですがどうも1回目の送信において一文字目がうまく送信されません。

送信プログラム
Byte[] dat = new byte[132];
while(true){
//1ブロックの初めにACK格納
dat[0] = SOH;
//2番目にブロックナンバー
dat[1] = BN;
//3番目にブロックナンバーの補数
dat[2] = BNC;
//dar[3]〜dat[130]にファイルデータを格納
for (int i = 3; i < 131; i++) {
//チェックサム計算
checksum[0] = (byte)(checksum[0] + dat[i]);
}
//チェックサム格納
dat[131] = checksum[0];
}

別PCの受信プログラム
while(true){
Byte[] dat = new byte[132];
serialPort1.Read(dat, 0, 131);
}
で読み込んでいます。

dat[]の中身は送信時にはdat[] =[1,1,254…]となっているのですが受信ではdat[]=[1,254,…]となっており最初の一文字を取りこぼしている状況です。
whileでループして2週目以降はちゃんと取得できているのですが何が原因でしょうか?


引用返信 編集キー/
■64558 / inTopicNo.4)  Re[3]: Visual C# でのXMODEMを用いたシリアル通信
□投稿者/ 甕星 (3回)-(2012/12/07(Fri) 01:29:21)
232Cの仕様。通信の最初は空のデータを送って、ハードウェアレベルのハンドシェイクを確立させる。これをやらないと、ストップビットなどの同期がとれていないまま通信がスタートしてしまったり、電気的なゴミが入ってたりして、最初の数バイト文字化けしたり、失われたりする場合があります。おまじないみたいなものです。
232Cでは取りこぼしなどは珍しくないので、あまり気にしない方が良いかと。XMODEMの手順に従って再送するだけの話ですしね。
引用返信 編集キー/
■64584 / inTopicNo.5)  Re[4]: Visual C# でのXMODEMを用いたシリアル通信
□投稿者/ daive (1回)-(2012/12/09(Sun) 09:45:24)
232、422、485系のデバッグ時には、
232、422、485用ラインモニタ
が、あると便利ですよ。

私が、昔から使っているのは、
ビッツ の「みえちゃん」シリーズです。
何台めかの、買い直し品が、今でも手元に残っています。

昔は、安いラインモニタも有ったのですが、
現在はどうなのでしょうね。

引用返信 編集キー/
■64599 / inTopicNo.6)  Re[5]: Visual C# でのXMODEMを用いたシリアル通信
□投稿者/ じゅうべい (4回)-(2012/12/10(Mon) 10:41:50)
甕星さんdaiveさんありがとうございます。
エラーは仕様なのですね、エラーチェックを持って対応しようと思います。
デバッグシステムも紹介していただきありがとうございました
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -