C#编写串口助手问题记录(2)

文章讨论了C#编写串口助手时遇到的问题,包括如何在发送数据时在每个字节间插入空格,正确计算发送数据的字节数,以及在不同模式下(文本/十六进制)的显示优化。提出了代码改进方案,确保在十六进制模式下正确处理数据,并准确显示接收字节数。
摘要由CSDN通过智能技术生成

C#编写串口助手问题记录(1)_FawayE的博客-CSDN博客

目录

4.发送数据时需要在输入的每个字节之间加上空格

代码运行分析:

5.正确显示发送数据的字节数

代码运行分析:

代码优化:

6.接收字符串显示

代码运行分析:

代码优化:

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();
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值