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 }