C#编写串口助手问题记录(1)_FawayE的博客-CSDN博客
目录
4.发送数据时需要在输入的每个字节之间加上空格
if (tbxSend.Text.Length % 2 == 0 && tbxSend.TextLength > 0)
// 如果输入的字符数是偶数,并且不为空
{
tbxSend.Text = tbxSend.Text.Insert(tbxSend.TextLength - 1, " ");
// 在倒数第二个字符后插入一个空格
tbxSend.SelectionStart = tbxSend.TextLength;
// 将光标移动到最后
}
代码运行分析:
只能在输入完成后的倒数第二个字符进行后加上空格,并不能在每次输入的字节后加空格,
未实现需求。
5.正确显示发送数据的字节数
//没有正确算出十六进制输出下的字节数,把每一个十六进制数作为一个字节。
sp.WriteLine(tbxSend.Text);
int sendBytes = Encoding.Default.GetBytes(tbxSend.Text).Length;
ByteSent += sendBytes;
//在界面上显示已发送的字节数
cbxByteSent.Text = "已发送:" + ByteSent.ToString() + " 字节";
代码运行分析:
没有正确算出十六进制输出下的字节数,把每一位十六进制数作为一个字节,需要把两位数作为一个字节计算。
代码优化:
try
{
if (isHex == true) // 如果是十六进制模式
{
// 将字符串转换为十六进制
string hexString = tbxSend.Text.Trim().Replace(" ", "");
byte[] buffer = new byte[hexString.Length / 2];
for (int i = 0; i < buffer.Length; i++)
{
buffer[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
}
// 将十六进制写入串口
sp.Write(buffer, 0, buffer.Length);
}
else // 如果是文本模式
{
sp.WriteLine(tbxSend.Text);
}
int sendBytes = isHex ? tbxSend.Text.Trim().Replace(" ", "").Length / 2 : Encoding.Default.GetBytes(tbxSend.Text).Length;
ByteSent += sendBytes;
// 在界面上显示已发送的字节数
cbxByteSent.Text = ByteSent.ToString() + " 字节";
}
在十六进制模式下,需要将文本框输入的字符串转换为十六进制数据,并写入串口。先通过.Trim()
方法去掉字符串两端的空格,然后通过.Replace()
方法将字符串中的空格去掉,生成一个不含空格的纯十六进制字符串hexString
。接着,根据该字符串的长度创建一个字节数组buffer
。使用for
循环将每两个字符转换成一个字节,存储到buffer
数组中。Convert.ToByte()
方法用于将两个字符转换成一个字节。最后,使用sp.Write()
方法将这个字节数组写入串口。该方法的第一个参数是要写入的字节数组,第二个参数是要写入的起始位置(一般设置为0),第三个参数是要写入的字节数。
在文本模式下,可以直接使用.WriteLine()
方法将文本框中的字符串写入串口。
通过三元运算符判断当前发送模式,计算出本次发送的字节数。如果是十六进制模式,则通过字符串长度除以2计算出字节数;如果是文本模式,则通过Encoding.Default.GetBytes()
方法获取字符串的字节数。将本次发送的字节数累加到ByteSent
变量中,并在界面上显示。
6.接收字符串的字节数显示
cbxByteRecv.Text = tbxRecv.Text.Length.ToString() + "字节";
//显示接收文本框的字节数
代码运行分析:
当自定义解说数据的显示格式,比如加上空格或者换行时,直接显示的是接收文本框的字节数,并不是实际接收到的字节数。
代码优化:
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int bytesToRead = sp.BytesToRead;
byte[] buffer = new byte[bytesToRead];
sp.Read(buffer, 0, bytesToRead);
BytesRecv += bytesToRead; //累加到接收字节数
if (isHex == false)
{
string data = Encoding.Default.GetString(buffer);
this.Invoke((MethodInvoker)delegate
{
tbxRecv.AppendText(data + Environment.NewLine);
cbxByteRecv.Text = BytesRecv.ToString() + "字节";
//显示已接收字节数
});
}
else
{
string hexData = BitConverter.ToString(buffer).Replace('-', ' ');
this.Invoke((MethodInvoker)delegate
{
tbxRecv.AppendText(hexData + Environment.NewLine); //添加换行符
cbxByteRecv.Text = BytesRecv.ToString() + "字节";//接收到的字节数
//cbxByteRecv.Text = tbxRecv.Text.Length.ToString() + "字节";
//显示接收文本框的字节数
});
}
sp.DiscardInBuffer();
}