4-Описание программы final (1061387), страница 2
Текст из файла (страница 2)
break;
case (byte)FrameType.ACK_UPLINK:
LinkActive = true;
DisplayData(MessageType.Normal, DateTime.Now + " ACK_UPLINK \n");
break;
case (byte)FrameType.RET:
DisplayData(MessageType.Normal, DateTime.Now + " RET \n");
WriteData(_currentMsg, FrameType.DAT, true);
break;
case (byte)FrameType.LINKACTIVE:
LinkActive = true;
DisplayData(MessageType.Normal, DateTime.Now + " LINKACTIVE \n");
WriteData(null, FrameType.ACK_LINKACTIVE, false);
break;
case (byte)FrameType.DAT:
DisplayData(MessageType.Normal, DateTime.Now + " DAT \n");
int bytes = comPort.BytesToRead;
byte[] comBuffer = new byte[bytes];
// записываем в массив данные от ком порта
comPort.Read(comBuffer, 0, bytes);
//отображаем информацию для пользователя
if (CyclicCode.Testing.DeCodingStr(comBuffer) == "") WriteData(null, FrameType.RET, false);//неуспешно приняли просим повторно
else
{
WriteData(null, FrameType.ACK, false);//успешно приняли отправляем квитанцию
DisplayData(MessageType.Incoming, user2 + " [ " + DateTime.Now + " ] \n" + CyclicCode.Testing.DeCodingStr(comBuffer) + "\n");
}
break;
default:
DisplayData(MessageType.Normal,DateTime.Now+" unknow frame \n");
break;
}
}
#endregion
#region Manager Constructors
public CommunicationManager(string baud, string par, string sBits, string dBits, string name, RichTextBox rtb)
{
_baudRate = baud;
_parity = par;
_stopBits = sBits;
_dataBits = dBits;
_portName = name;
_displayWindow = rtb;
comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
}
public CommunicationManager()
{
_baudRate = string.Empty;
_parity = string.Empty;
_stopBits = string.Empty;
_dataBits = string.Empty;
_portName = "COM1";
_displayWindow = null;
comPort.DataReceived += new SerialDataReceivedEventHandler(comPort_DataReceived);
}
#endregion
#region WriteData
public void WriteData(string msg,FrameType CurrentFrameType, bool msg_no_display)
{
byte[]FrameFields={START,(byte)CurrentFrameType};//заполняем первые два поля кадра стартовый и тип
switch (CurrentFrameType)
{
case FrameType.DAT:
try
{
//преобразуем сообщение в массив типа byte
byte[] newMsg = CyclicCode.Testing.CodingStr(msg).ToArray();
comPort.Write(FrameFields,0,2);
//отсылаем сообщение в порт
comPort.Write(newMsg, 0, newMsg.Length);
if (!msg_no_display) DisplayData(MessageType.Outgoing, user1+" [ " + DateTime.Now + " ] \n" + msg + "\n");
}
catch (FormatException ex)
{
DisplayData(MessageType.Error, ex.Message);
}
break;
default:
if (!(comPort.IsOpen == true)) comPort.Open();
comPort.Write(FrameFields, 0, 2);
break;
}
}
#endregion
#region DisplayData
[STAThread]
private void DisplayData(MessageType type, string msg)
{
_displayWindow.Invoke(new EventHandler(delegate
{
_displayWindow.SelectedText = string.Empty;
_displayWindow.SelectionFont = new Font(_displayWindow.SelectionFont, FontStyle.Bold);
_displayWindow.SelectionColor = MessageColor[(int)type];
_displayWindow.AppendText(msg);
_displayWindow.ScrollToCaret();
}));
}
#endregion
#region OpenPort
public bool OpenPort()
{
try
{
if (comPort.IsOpen == true) comPort.Close();
//установка параметров ком порта
comPort.BaudRate = int.Parse(_baudRate);
comPort.DataBits = int.Parse(_dataBits);
comPort.StopBits = (StopBits)Enum.Parse(typeof(StopBits), _stopBits);
comPort.Parity = (Parity)Enum.Parse(typeof(Parity), _parity);
comPort.PortName = _portName;
comPort.RtsEnable = true;
comPort.Open();
//отображение сообщения
DisplayData(MessageType.Normal, "Порт открыт " + DateTime.Now + "\n");
return true;
}
catch (Exception ex)
{
DisplayData(MessageType.Error, ex.Message);
return false;
}
}
#endregion
#region SetParityValues
public void SetParityValues(object obj)
{
foreach (string str in Enum.GetNames(typeof(Parity)))
{
((ComboBox)obj).Items.Add(str);
}
}
#endregion
#region SetStopBitValues
public void SetStopBitValues(object obj)
{
foreach (string str in Enum.GetNames(typeof(StopBits)))
{
((ComboBox)obj).Items.Add(str);
}
}
#endregion
#region SetPortNameValues
public void SetPortNameValues(object obj)
{
foreach (string str in SerialPort.GetPortNames())
{
((ComboBox)obj).Items.Add(str);
}
}
#endregion
#region comPort_DataReceived
void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
dt_new = DateTime.Now;
switch(comPort.ReadByte())
{
case START:
{
FrameAnalysis((byte)comPort.ReadByte());
}
break;
default:
{
WriteData(null, FrameType.RET, false);
}
break;
}
}
#endregion
#region ClosePort
public bool ClosePort()
{
try
{
if (comPort.IsOpen == true) comPort.Close();
DisplayData(MessageType.Normal, "Порт закрыт " + DateTime.Now + "\n");
return true;
}
catch (Exception ex)
{
DisplayData(MessageType.Error, ex.Message);
return false;
}
}
#endregion
}
}
Testing.cs (кодирование и декодирование)
using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
namespace CyclicCode
{
class Testing
{
/// <summary>
/// Процедура кодирования
/// циклическим кодом с образующим полиномом g(x)=x^3+x+1
/// </summary>
/// <param name="a">информационные разряды</param>
/// <param name="n">образующий полином</param>
/// <param name="code">результат кодовая комбинация</param>
static void CycleCode(byte a, byte n, out byte code)
{
a <<= 3;///умножаем исходную код
///считаем число разрядов
while (CountBit(a) != CountBit(n)) n <<= 1;//уравняли по двоичному порядку делимое и делитель
code = a;
///цикла while-необходим для получения остатка от деления
///v(x)*x^n-k на образующий полином.
do //цикл, когда a> 111,все что меньше идет в остаток
{
a ^= n;
do
{
n >>= 1;
}
while (CountBit(a) != CountBit(n));
} while (a > 7);
code |= a; // приписываем остаток в начало кодового вектора
}//CycleCode()
static int CountBit(byte a)
{
int count = 0;
while(!(a==0))
{
a /= 2;
++count;
}
return (count);
}
static bool CycleDecode(byte a,out byte code,byte n)
{
while (CountBit(a) != CountBit(n)) n <<= 1;//уравняли по двоичному порядку делимое и делитель
///цикла while-необходим для получения остатка от деления
///v(x)*x^n-k на образующий полином.
code = a;
do //цикл, когда a> 111,все что меньше идет в остаток
{
code ^= n;
do
{
n >>= 1;
}
while (CountBit(code) != CountBit(n)) ;
}
while (code > 7);
if (code == 0)
{
code =(byte) (a >> 3);
return (true);
}
else return (false);
}
/// <summary>
/// Процедура кодирования строки текста
/// </summary>
/// <param name="str">строка из текстбокса</param>
static public List<byte> CodingStr(string str)
{
char[] ChrArr;
///////////////////////
byte LShort, HShort;
///////////////////////
byte LWord, HWord;//младшая и старшие части символа.(получаются накладыванием маски)
byte Gx=11;//образующий полином
byte Code;
List<byte> CodingString=new List<byte>();
ChrArr = str.ToCharArray();
//////////////////////////////////////////////
short[] ShortArr=new short[str.Length];
for (int i = 0; i < ChrArr.Length; i++)
{
ShortArr[i] = (short)ChrArr[i];
}
for (int i = 0; i < ShortArr.Length; i++)
{
LShort = (byte)(ShortArr[i] & 0x00FF);//получаем младшие 4 разряда маской 0000000011111111;
HShort = (byte)((ShortArr[i] & 0xFF00) >> 8);//получаем старшие(маска 1111111100000000) и сдвигаем вначало
LWord = (byte)(LShort & 0x0F);//получаем младшие 4 разряда маской 00001111;
HWord = (byte)((LShort & 0xF0) >> 4);//получаем старшие(маска 11110000) и сдвигаем вначало
CycleCode(LWord, Gx, out Code);
CodingString.Add(Code);
CycleCode(HWord, Gx, out Code);
CodingString.Add(Code);
/////////////////////////////////////
LWord = (byte)(HShort & 0x0F);//получаем младшие 4 разряда маской 00001111;
HWord = (byte)((HShort & 0xF0) >> 4);//получаем старшие(маска 11110000) и сдвигаем вначало
CycleCode(LWord, Gx, out Code);
CodingString.Add(Code);
CycleCode(HWord, Gx, out Code);
CodingString.Add(Code);
}
return(CodingString);
}//CodingStr()
/// <summary>
/// метод декодирования исходной строки байтов в строку, введенную пользователем
/// </summary>
/// <param name="str">закодированая строка байтов</param>
/// <returns></returns>
static public string DeCodingStr(byte[] str)
{
char ch;
string DecodedString="";
byte LWord, HWord;//младшая и старшие части символа.(получаются накладыванием маски)
//////////////////////////
short LShort, HShort;
//////////////////////////
byte Gx = 11;//образующий полином
for (int i = 0; i < str.Length;i++)
{
if(!CycleDecode(str[i],out LWord,Gx)) return("");
if(!CycleDecode(str[++i], out HWord, Gx)) return("");
////////////////////////////////////
LShort=(short)((HWord<<4) |LWord);
///////////////////////////////////
if(!CycleDecode(str[++i], out LWord, Gx)) return("") ;
if(!CycleDecode(str[++i], out HWord, Gx)) return("");
HShort = (short)((HWord << 4) | LWord);
ch=Convert.ToChar((HShort<<8)|LShort);
Console.WriteLine("ch={0}", ch);
DecodedString+=ch;
}
return (DecodedString);
}
}
}
Main.cs (Главная форма)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using PCComm;
namespace PCComm
{
public partial class frmMain : Form
{
#region variables
Timer mytimer = new Timer();//таймер приема ACK_UPLINK
Timer mytimer1 = new Timer();//таймер приема ACK_DOWNLINK
Timer mytimer2 = new Timer();//таймер приема ACK_ACTIVELINK
Timer mytimer3 = new Timer();//таймер приема ACK_ACTIVELINK
int CountDownLinkTry = 3; //попыток разорвать соединение
int CountTry = 3; // попыток соединения
int CountTryActiveLink = 3; //попыток доступа к среде
CommunicationManager comm = new CommunicationManager();
string transType = string.Empty;
string user1; // имя пользователя № 1
string user2; // имя пользователя № 2
Form4 f = new Form4();
private string settings_file = Application.StartupPath + @"\settings.txt"; // путь к файлу настроек
#endregion
public frmMain()
{
InitializeComponent();
}
private void frmMain_Load(object sender, EventArgs e)
{
f.FormClosed +=new FormClosedEventHandler(f_FormClosed);
LoadValues();
SetDefaults();
SetControlState();
}
private void f_FormClosed(object sender, EventArgs e)
{
user1 = f.user1;
user2 = f.user2;
comm.user1 = user1;
comm.user2 = user2;
}
private void cmdOpen_Click(object sender, EventArgs e)
{
CountTry = 3;
CountTryActiveLink = 3;
CountDownLinkTry = 3;
comm.Parity = cboParity.Text;
comm.StopBits = cboStop.Text;
comm.DataBits = cboData.Text;
comm.BaudRate = cboBaud.Text;
comm.DisplayWindow = rtbDisplay;
comm.PortName = cboPort.Text;
comm.OpenPort();
cmdOpen.Enabled = false;
cmdClose.Enabled = true;
cmdConnect.Enabled = true;
cmdConnect.Select();
}















