|
分類:[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〜からになってしまう)。 この二つについて質問をしたいですよろしくお願いします
|