欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#把汉字转换成16进制(HEX)并向串口发送数据

程序员文章站 2022-03-13 17:51:56
报警器实例:(有发送,无返回获取) ......

报警器实例:(有发送,无返回获取)

 1 using system;
 2 using system.collections.generic;
 3 using system.linq;
 4 using system.text;
 5 using system.io.ports;
 6 using system.text.regularexpressions;
 7 using system.windows.forms;
 8 
 9 namespace zkjfjk
10 {
11     /***
12      报警器语音输出类,只需在调用时填写需要播报汉字即可
13      * 例:bool tf = new sendvoice().send("机房报警温度过高");
14      * 其返回一个bool类型值tf,当tf为true时。则发送成功,否则发送失败;
15      */
16     class sendvoice
17     {
18         serialport spformdata = new serialport();//实例化串口通讯类
19         public bool send(string voicestr)
20         {
21             spformdata.close();
22             spformdata.portname = "com9";//串口号
23             spformdata.baudrate = 9600;//波特率
24             spformdata.databits = 8;//数据位
25             spformdata.stopbits = (stopbits)int.parse("1");//停止位
26             spformdata.readtimeout = 500;//读取数据的超时时间,引发readexisting异常
27             spformdata.open();//打开串口
28             byte[] temp = new byte[1];
29             try
30             {
31                 /***************** 汉字转换为十六进制数(hex)部分 ********************************/
32                 //把汉字转换为十六进制数(hex)
33                 if ((voicestr.length % 2) != 0)
34                 {
35                     voicestr += " ";//空格
36                 }
37                 system.text.encoding chs = system.text.encoding.getencoding("gb2312");
38                 byte[] bytes = chs.getbytes(voicestr);
39                 string str = "";
40                 for (int i = 0; i < bytes.length; i++)
41                 {
42                     str += string.format("{0:x}", bytes[i]);
43                 }
44                 string voicehex = "23" + str + "ff ff ff"; //转换成功的16进制数,加上报警器格式的开头与结尾
45 
46                 /***************** 串口发送数据部分 ***********************************************/
47                 //首先判断串口是否开启
48                 if (spformdata.isopen)
49                 {
50                     int num = 0;   //获取本次发送字节数
51                     //串口处于开启状态,将发送区文本发送
52                     //判断发送模式
53                     if (true)
54                     {
55                         //以hex模式发送
56                         //首先需要用正则表达式将用户输入字符中的十六进制字符匹配出来
57                         string buf = voicehex;
58                         string pattern = @"\s";
59                         string replacement = "";
60                         regex rgx = new regex(pattern);
61                         string send_data = rgx.replace(buf, replacement);
62                         //不发送新行
63                         num = (send_data.length - send_data.length % 2) / 2;
64                         for (int i = 0; i < num; i++)
65                         {
66                             temp[0] = convert.tobyte(send_data.substring(i * 2, 2), 16);
67                             spformdata.write(temp, 0, 1);  //循环发送
68                         }
69                         //自动发送新行
70                         spformdata.writeline("");
71                         return true;
72                     }
73                 }
74             }
75             catch (exception ex)
76             {
77                 spformdata.close();
78                 //捕获到异常,创建一个新的对象,之前的不可以再用
79                 spformdata = new system.io.ports.serialport();
80                 //响铃并显示异常给用户
81                 system.media.systemsounds.beep.play();
82                 messagebox.show(ex.message);
83             }
84             return false;
85         }
86     }
87 }