今日尝试使用C# Winform写一个上位机软件控制 SYN6288语音模块
这里不讲什么基本原理(或者讲的比较略简),直接讲实现了就......
文章提供测试代码讲解、测试效果图、整体测试工程下载
目录
控件的摆放:
如图摆放控件:主要有Button、label、picturebox、listview、check、serialport、imaginelist
SYN6288介绍:
代码编程:
对16进制发送长串的处理:
条件判断:首先,它通过一个
else
语句块来确定当前是处于“16进制发送”模式(这通常是通过某个界面元素,如复选框checkBox2
的选中状态来控制的,但在这段代码中并没有直接显示这个条件)。异常处理(外层):使用了一个
try-catch
块来捕获并处理在尝试发送16进制数据时可能发生的任何异常。这个外层try-catch
块主要是用来捕获由数据转换(即,将字符串转换为字节数组)过程中可能发生的异常,比如如果输入字符串包含无法转换为16进制字节的字符(尽管在这个特定的实现中,通过移除空格和转换为大写,以及检查字符串长度为偶数,已经减少了这种可能性)。字符串处理:
- 从
textBox1
中获取用户输入的字符串,并使用Replace(" ", "").ToUpper()
方法移除所有空格并将字符串转换为大写。这是为了确保输入数据的一致性,因为空格和大小写差异在16进制表示中是有意义的。- 检查处理后的字符串长度是否为偶数。因为每两个16进制字符代表一个字节,所以字符串长度必须是偶数才能正确转换为字节数组。如果不是偶数,则记录一条日志消息(通过调用
myaddlog
函数)并返回,不执行发送操作。数据转换:
- 创建一个字节数组
data
,其大小等于处理后的字符串长度除以2(因为每两个字符代表一个字节)。- 使用一个
for
循环遍历处理后的字符串,每次迭代处理两个字符,并使用Convert.ToByte
方法将它们从16进制字符串转换为字节,然后存储在data
数组中。发送数据:
- 在内层的
try-catch
块中,尝试使用serialPort1.Write
方法将data
数组发送到串口。如果发送成功,则记录一条“16进制数据发送成功”的日志消息。- 如果在发送过程中发生异常(例如,串口已关闭或硬件问题),则捕获该异常,并记录一条包含异常消息的日志。
数据转换错误处理:
- 外层的
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