C#学习笔记14:SYN6288语音模块_Winform上位机控制软件

今日尝试使用C# Winform写一个上位机软件控制 SYN6288语音模块

这里不讲什么基本原理(或者讲的比较略简),直接讲实现了就......

文章提供测试代码讲解、测试效果图、整体测试工程下载

目录

控件的摆放:

SYN6288介绍:

代码编程:

对16进制发送长串的处理:

对中文语句发送的处理:

将字符串按照GB2312编码进行编码检查:

GB2312转HEX:

构建数据包:

整体代码贴出:

测试视频:

整体测试工程下载:

网上查阅资料贴出:


控件的摆放:

 如图摆放控件:主要有Button、label、picturebox、listview、check、serialport、imaginelist

SYN6288介绍:

代码编程:

对16进制发送长串的处理:

  1. 条件判断:首先,它通过一个else语句块来确定当前是处于“16进制发送”模式(这通常是通过某个界面元素,如复选框checkBox2的选中状态来控制的,但在这段代码中并没有直接显示这个条件)。

  2. 异常处理(外层):使用了一个try-catch块来捕获并处理在尝试发送16进制数据时可能发生的任何异常。这个外层try-catch块主要是用来捕获由数据转换(即,将字符串转换为字节数组)过程中可能发生的异常,比如如果输入字符串包含无法转换为16进制字节的字符(尽管在这个特定的实现中,通过移除空格和转换为大写,以及检查字符串长度为偶数,已经减少了这种可能性)。

  3. 字符串处理

    • textBox1中获取用户输入的字符串,并使用Replace(" ", "").ToUpper()方法移除所有空格并将字符串转换为大写。这是为了确保输入数据的一致性,因为空格和大小写差异在16进制表示中是有意义的。
    • 检查处理后的字符串长度是否为偶数。因为每两个16进制字符代表一个字节,所以字符串长度必须是偶数才能正确转换为字节数组。如果不是偶数,则记录一条日志消息(通过调用myaddlog函数)并返回,不执行发送操作。
  4. 数据转换

    • 创建一个字节数组data,其大小等于处理后的字符串长度除以2(因为每两个字符代表一个字节)。
    • 使用一个for循环遍历处理后的字符串,每次迭代处理两个字符,并使用Convert.ToByte方法将它们从16进制字符串转换为字节,然后存储在data数组中。
  5. 发送数据

    • 在内层的try-catch块中,尝试使用serialPort1.Write方法将data数组发送到串口。如果发送成功,则记录一条“16进制数据发送成功”的日志消息。
    • 如果在发送过程中发生异常(例如,串口已关闭或硬件问题),则捕获该异常,并记录一条包含异常消息的日志。
  6. 数据转换错误处理

    • 外层的catch块(这里没有指定异常类型,因此会捕获所有类型的异常)用于处理数据转换过程中可能发生的任何错误(尽管在这个特定的实现中,由于前面的字符串处理和数据转换逻辑,这种错误的可能性很小)。如果发生这种错误,则记录一条“数据转换错误,请输入16进制数”的日志消息。然而,需要注意的是,由于这个catch块紧跟在字符串处理和数据转换代码之后,并且没有更具体的异常类型指定,它实际上可能会捕获到任何在try块中发生的异常,而不仅仅是数据转换错误。
                    //16进制发送:
                    else                                                                    //数据模式
                    {
                        try  //如果此时用户输入字符串中含有非法字符(字母,汉字,符号等等,try,catch块可以捕捉并提示)
                        {
                            string hexString = textBox1.Text.Replace(" ", "").ToUpper(); // 移除空格并转换为大写 
                            if (hexString.Length % 2 != 0)
                            {
                                myaddlog(1, "输入的16进制数据长度必须为偶数!");
                                // MessageBox.Show("输入的16进制数据长度必须为偶数!");
                                return;
                            }
                            byte[] data = new byte[hexString.Length / 2];
                            for (int i = 0; i < hexString.Length; i += 2)
                            {
                                data[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
                            }
                            try
                            {
                                serialPort1.Write(data, 0, data.Length);
                                myaddlog(0, "16进制数据发送成功");
                            }
                            catch (Exception ex)
                            {
                                myaddlog(1, "串口数据写入错误: " + ex.Message);
                            }
                        }
                        catch
                        {
                            myaddlog(1, "数据转换错误,请输入16进制数");
                        }
                    }

对中文语句发送的处理:

在C#中,SerialPort.Write 方法实际上并不直接接受十六进制字符串作为输入。它接受一个字节数组(byte[])或者一个字符串(但字符串会被按照当前编码转换为字节序列发送,这通常不是我们想要的,特别是当想发送特定的十六进制数据时)。

因此,如果想要以十六进制形式发送数据(即 packet 字符串所表示的数据),需要先将这个十六进制字符串转换为一个字节数组。

其中以下函数在文章之后有单独定义与解释:

GB2312转HEX:

public static string StringToHexString(string input, Encoding encoding)

将字符串按照GB2312编码进行编码检查:

public static bool IsStringEncodableInGB2312(string input)

构建数据包:

  public string BuildPacket()

             if (textBox1.Text != "")
             {
                 //如果不是16进制发送
                 if (!checkBox2.Checked)
                 {
                     try
                     {
                         string text = textBox1.Text;
                         isencodable= IsStringEncodableInGB2312(text);
                         if (isencodable == false)
                         {
                             myaddlog(1, "你输入的不是GB2312中文编码格式");
                             return;
                         }
                         else
                         {
                             Encoding gb2312 = Encoding.GetEncoding("GB2312"); // 获取GB2312编码(注意:在某些系统上可能需要使用GBK)
                             hexString1 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NULL指向我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值