????????接收统计与发送统计功能开发,旨在统计发送字节数与接收字节数并且显示在指定的文本框内,发送接收清除按钮则是清零统计字节数量。
//统计接收字节数
UInt32 RBytes = Convert.ToUInt32(textBox7.Text, 10);//定义接收字节数变量,并初始化为已接收字节数
RBytes += (UInt32)str.Length;//加ASCII码字节数
textBox5.Text = Convert.ToString(RBytes, 10);//显示总字节数
//统计接收字节数
UInt32 RBytes = Convert.ToUInt32(textBox6.Text, 10);//定义接收字节数变量,并初始化为已接收字节数
RBytes += (UInt32)data.Length;//加HEX字节数
textBox6.Text = Convert.ToString(RBytes, 10);//显示总字节数
//清除接收按钮
private void button6_Click(object sender, EventArgs e)
{
textBox1.Text = ""; //清空文本
textBox7.Text = "0"; //清零接收计数
}
//统计发送字节数
UInt32 SBytes = Convert.ToUInt32(textBox5.Text, 10);//定义发送字节数变量,并初始化为已接收字节数
SBytes += (UInt32)Sendbytes.Length;//加ASCII码字节数
if (checkBox26.Checked == true)//加回车换行2个字节
SBytes += 2;
textBox5.Text = Convert.ToString(SBytes, 10);//显示总发送字节数
//统计发送字节数
UInt32 SBytes = Convert.ToUInt32(textBox6.Text, 10);//定义发送字节数变量,并初始化为已接收字节数
SBytes += (UInt32)Calculate_CRC.Length;//加HEX字节数
//byte[] Calculate_CRC = new byte[ (Buf.Length - Buf.Length % 2) / 2];//同等替用
if (checkBox25.Checked == true)//加CRC校验2个字节
SBytes += 2;
textBox6.Text = Convert.ToString(SBytes, 10);//显示总发送字节数
//清除发送按钮
private void button28_Click(object sender, EventArgs e)
{
textBox5.Text = "";//清空文本
textBox6.Text = "0";//清零总发送计数
}
//串口接收
private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//接收格式为ASCII码
if (!checkBox16.Checked)//复用框没有被选择时
{
try
{
textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->");
string str = serialPort1.ReadExisting();//将接收到的数据存在自定义的字符串变量中
textBox1.AppendText(str + "\r\n");
//统计接收字节数
UInt32 RBytes = Convert.ToUInt32(textBox7.Text, 10);//定义接收字节数变量,并初始化为已接收字节数
RBytes += (UInt32)str.Length;//加ASCII码字节数
textBox7.Text = Convert.ToString(RBytes, 10);//显示总接收字节数
}
catch
{
textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->");
textBox1.AppendText("ASCII格式接收错误!\r\n");
}
}
//接收格式为HEX
else
{
try
{
textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->");
byte[] data = new byte[serialPort1.BytesToRead];//定义接收缓冲区,长度为串口接收的数据长度
serialPort1.Read(data, 0, data.Length);//形参,起始位置,终止位置,将读取的数据存放在缓冲区
//遍历用法
foreach (byte Member in data)//循环函数
{
string str = Convert.ToString(Member, 16).ToUpper();//转化为十六进制大写
textBox1.AppendText((str.Length == 1 ? "0" + str : str) + " ");//数据+空格“”
}
textBox1.AppendText("\r\n");
//统计接收字节数
UInt32 RBytes = Convert.ToUInt32(textBox7.Text, 10);//定义接收字节数变量,并初始化为已接收字节数
RBytes += (UInt32)data.Length;//加HEX字节数
textBox7.Text = Convert.ToString(RBytes, 10);//显示总接收字节数
}
catch
{
textBox1.AppendText("[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "->");
textBox1.AppendText("HEX格式接收错误!\r\n");
}
}
}
//串口发送按钮
private void button29_Click(object sender, EventArgs e)
{
byte[] data = new byte[1];//发送函数需要定义数组首地址
//发送格式为ASCII
if (!checkBox24.Checked)//复用框没有被选择时
{
try
{
//支持中文输出
Encoding Chinese = System.Text.Encoding.GetEncoding("GB2312");//定义一个可以进行中文编码的变量
byte[] Sendbytes = Chinese.GetBytes(textBox5.Text);//将发送框的内容编译为中文
//遍历发送用法
foreach (byte Member in Sendbytes)//循环函数
{
data[0] = Member;
serialPort1.Write(data, 0, 1);//单字节发送
}
//发送回车换行
if (checkBox26.Checked)//发空复选框
{
data[0] = 0x0D;//发送回车
serialPort1.Write(data, 0, 1);
data[0] = 0x0A;//发送换行
serialPort1.Write(data, 0, 1);
}
//统计发送字节数
UInt32 SBytes = Convert.ToUInt32(textBox6.Text, 10);//定义发送字节数变量,并初始化为已接收字节数
SBytes += (UInt32)Sendbytes.Length;//加ASCII码字节数
if (checkBox26.Checked == true)//加回车换行2个字节
SBytes += 2;
textBox6.Text = Convert.ToString(SBytes, 10);//显示总发送字节数
}
catch
{
textBox1.AppendText("\r\n串口数据发送错误!\r\n");
//textBox5.Text = "";//若出现错误不清空发送框的内容
//串口按钮显示为关闭
serialPort1.Close();
button2.BackgroundImage = Properties.Resources.Image_CloseSerial;
button2.Tag = "OFF";
timer1.Stop();//串口关闭情况下关闭串口有效检测功能
}
}
//发送格式为HEX
else
{
//处理字符串
string Buf = textBox5.Text;
Buf = Buf.Replace("0x", string.Empty);//将buf中的0x替换为空格,消除0x的不规范书写方式
Buf = Buf.Replace("0X", string.Empty);
Buf = Buf.Replace(" ", string.Empty);
byte[] Calculate_CRC = new byte[(Buf.Length - Buf.Length % 2) / 2];//CRC缓存区
textBox5.Text = " ";
//循环发送
for (int i = 0; i < (Buf.Length - Buf.Length % 2) / 2; i++)//取余运算作用是防止用户输入的字符为奇数个
{
textBox5.AppendText(Buf.Substring(i * 2, 2) + " ");//Buf.Substring为Buf的子字符串,长度为2
try
{
data[0] = Convert.ToByte(Buf.Substring(i*2,2),16);//将字符串转换为十六进制的整型
serialPort1.Write(data, 0, 1);//单字节发送
Calculate_CRC[i] = data[0];//CRC参数赋值
}
catch
{
textBox1.AppendText("\r\n串口数据发送错误!\r\n");
//textBox5.Text = "";//若出现错误不清空发送框的内容
//串口按钮显示为关闭
serialPort1.Close();
button2.BackgroundImage = Properties.Resources.Image_CloseSerial;
button2.Tag = "OFF";
timer1.Stop();//串口关闭情况下关闭串口有效检测功能
}
}
//发送CRC
if (checkBox25.Checked)
{
UInt32 CRC = Crc_Check(Calculate_CRC, (byte)Calculate_CRC.Length);//crc计算
byte CRC_H = (byte)(CRC >> 8);
byte CRC_L = (byte)CRC;
try
{
data[0] = CRC_L;
serialPort1.Write(data, 0, 1);//发送低位
data[0] = CRC_H;
serialPort1.Write(data, 0, 1);//发送高位
}
catch
{
textBox1.AppendText("\r\n串口数据发送错误!\r\n");
//textBox5.Text = "";//若出现错误不清空发送框的内容
//串口按钮显示为关闭
serialPort1.Close();
button2.BackgroundImage = Properties.Resources.Image_CloseSerial;
button2.Tag = "OFF";
timer1.Stop();//串口关闭情况下关闭串口有效检测功能
}
}
//统计发送字节数
UInt32 SBytes = Convert.ToUInt32(textBox6.Text, 10);//定义发送字节数变量,并初始化为已接收字节数
SBytes += (UInt32)Calculate_CRC.Length;//加HEX字节数
//byte[] Calculate_CRC = new byte[ (Buf.Length - Buf.Length % 2) / 2];//同等替用
if (checkBox25.Checked == true)//加CRC校验2个字节
SBytes += 2;
textBox6.Text = Convert.ToString(SBytes, 10);//显示总发送字节数
}
//发送完清空
if (checkBox23.Checked)//发空复选框
{
textBox5.Text = "";
}
}
发送接收计数文本框均有准确的数据增添,按下发送接收清除按钮,数据均清零,输出接收字节计数功能开发成功
参考自B站硬件家园