命名空间:netMarketing.automation.communication
功能:RS232串口读写
功能详细说明:
netMarketing类库中许多类都有后缀helper,通常这些类都是些使用频度较高的类,serialHelper类就是一个高频类,你可以在编写诸如plc内存读写模块时继承本类就可以直接使用串口功能。
在工业自动化行业里,串口是使用频度比较高的通讯口,它就像电脑的键盘,很古老却好像总是会存在,可见其重要性。
测试串口读写不需要实际硬件也可以测试,方法是安装VSPD虚拟串口软件,可以参考下面帖子的介绍。
工业自动化行业软件工程师们的常用软件(一)
常用函数列表:
//类构造函数,使用本类必须使用本构造函数,不要使用无参数构造函数(bug) //serialno可以随便填写,但是不要小于0,这个参数已经作废 //串口名COM1,波特率等放在param中填写 public serialHelper(int serialno,string portExpaintStr, SerialParamType param) //字符串转Parity public static Parity strToParity(string str) //字符串转StopBits public static StopBits strToStopBits(string str) //向串口发送内容 public void Write(string content) public void Write(byte[] content, int offset = 0, int count = 0) //读串口缓冲区 public byte[] Read(int nCount) public bool Read(out string rtnString) public bool Read(out byte[] rtnByteArray) public bool ReadLine(out string rtnString) public bool ReadExisting(out string rtnString) public bool ReadTo(out string rtnString, string terminator = "\r\n", int readTimeOut = 1000) //取本机可用串口列表 public static List<string> GetMacPortList() //关闭串口 public void Close() //以下为静态数据 //波特率列表 serialHelper.PortBaudRateList //波特率列表 serialHelper.ParityList //校验位名称列表 serialHelper.StopBitsList //数据位值列表 DataBitsList //自定义异常 SerialFunException SerialFunPortOpenFail 另外,本类没有开放串口接收事件,是考虑到串口事件属于异步编程会让程序编写变复杂, 实际运用中,同步读写(发指令并等待读取返回)是更好的安全解决方案。
参考例子:
com5,com6都是虚拟出来的串口,向com5写内容,com6就可以收到,反过来也一样。
如果一般的测试仪器的COM口发出的数据,总会在内容后面追加结束符,有时候也会在内容前追加结束符。
结束符一般是非打印字符构成,是ASCII码中小于32(空格)的字符。
结束符的作用非常重要,它可以让我们读取串口缓冲区的字符的时候,并不是有内容就拿来使用,而是要读到这个结束符后才可以确定我们读到的内容是完整的。
如果没有结束符,会出现偶尔信息会只读到一部分的现象。
玩过欧姆龙PLC的朋友,在其串设置里面,有这样一个设置
实际上后面两项就是用来设置结束码的。
下面的例子里结束为\r
using netMarketing.automation; using sharClass; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using static netMarketing.thread.workThread; namespace comtest { public partial class Form1 : Form { serialHelper com1; serialHelper com2; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { try { com1 = new serialHelper(0, "这是com5口", new serialHelper.SerialParamType() { PortName = "COM4", PortBaudRate = 115200, PortDataBits = 8, PortParity = System.IO.Ports.Parity.Even, PortStopBits = System.IO.Ports.StopBits.One }); com2 = new serialHelper(0, "这是com6口", new serialHelper.SerialParamType() { PortName = "COM5", PortBaudRate = 115200, PortDataBits = 8, PortParity = System.IO.Ports.Parity.Even, PortStopBits = System.IO.Ports.StopBits.One }); ThreadPool.QueueUserWorkItem(new WaitCallback(recv)); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void recv(object m) { var buff1 =new StringBuilder(); var buff2 = new StringBuilder(); var t1 = string.Empty; var t2 = string.Empty; while (true) { //如果在串口缓存里面没有读到结束符,就要累加读到的内容,这样能保证读到内容的完整性。 var f1=com1.ReadExisting(out t1); if (f1 && t1.EndsWith("\r")) { buff1.Append(t1); outmsg(rtbRecvMsg1, buff1.ToString().Replace("\r", "")); buff1.Clear(); } else if(f1 && t1.Length>0) { buff1.Append(t1); } f1=com2.ReadExisting(out t2); if(f1 && t2.EndsWith("\r")) { buff2.Append(t2); outmsg(rtbRecvMsg2, buff2.ToString().Replace("\r", "")); buff2.Clear(); } else if (f1 && t2.Length > 0) { buff2.Append(t2); } ShowAlarm.Delay(50); } } private void btnSend1_Click(object sender, EventArgs e) { if(com1.IsOpen) { com1.Write(tbSendMsg1.Text+"\r"); } } private void btnSend2_Click(object sender, EventArgs e) { if (com2.IsOpen) { com2.Write(tbSendMsg2.Text+"\r"); } } private void outmsg(RichTextBox box,string msg) { if (box.InvokeRequired) { box.Invoke(new Action(() => { box.AppendText(msg); })); } else { box.AppendText(msg); } } } }
2018/12/31勇哥注:
非常重要的一点请各位关注:
newMarketingv1.2.9 及以前的版本,其serialHelper类缺少一组初始化的常量。
这会造成在读取某些日本的仪表仪器时(例如三丰的厚度表,某些日系的电阻内压仪等)会出现读不出内容,或者是读一次后,串口 失灵,连串口助手也连接不上了,必须要重启电脑或者重启串口的现象。
这个是因为日系的仪器往往RS232不是只用了TXD,RXD这两根线,还有其它引脚的信号交换。
这个缺陷会在下个版本netMarketing修正。
引外,serialHelper还有readTo()函数存在bug,也放在下个版本一起修正。
附件: C#转义符对应的ASCII字符,以及ASCII字符表:
在一些特殊场合,需要将字节控制位转换成字符,比如172为二进制的10101100,十六进制为0xAC,它没有可见的字符与之对应,所以没法用 char cCao = ‘C’ 这样的操作,只能通过转义字符来实现,这就是'\x',如,'\xXXX',即,将十六进制的数字'XXX'转换成字符:
char cCao = ‘\x43’; // char cCao = ‘C’;
这里要注意的是,C语言使用者在C#中容易犯一个错误,即,C语言中将十六进制转换成字符的转义字符为'\0x',而C#中用'\x'。
另外还有一些单字节常用转义符列举如下:
\' 单引号 0x0027
\" 双引号 0x0022
\\ 反斜杠 0x005C
\0 空 0x0000
\a 警报(感叹号) 0x0007
\b 退格符 0x0008
\f 换页符 0x000C
\n 换行符 0x000A
\r 回车 0x000D
\t 水平制表符 0x0009
\v 垂直制表符 0x000B
ASCII码表
Bin | Dec | Hex | 缩写/字符 | 解释 |
00000000 | 0 | 00 | NUL(null) | 空字符 |
00000001 | 1 | 01 | SOH(start of headling) | 标题开始 |
00000010 | 2 | 02 | STX (start of text) | 正文开始 |
00000011 | 3 | 03 | ETX (end of text) | 正文结束 |
00000100 | 4 | 04 | EOT (end of transmission) | 传输结束 |
00000101 | 5 | 05 | ENQ (enquiry) | 请求 |
00000110 | 6 | 06 | ACK (acknowledge) | 收到通知 |
00000111 | 7 | 07 | BEL (bell) | 响铃 |
00001000 | 8 | 08 | BS (backspace) | 退格 |
00001001 | 9 | 09 | HT (horizontal tab) | 水平制表符 |
00001010 | 10 | 0A | LF (NL line feed, new line) | 换行键 |
00001011 | 11 | 0B | VT (vertical tab) | 垂直制表符 |
00001100 | 12 | 0C | FF (NP form feed, new page) | 换页键 |
00001101 | 13 | 0D | CR (carriage return) | 回车键 |
00001110 | 14 | 0E | SO (shift out) | 不用切换 |
00001111 | 15 | 0F | SI (shift in) | 启用切换 |
00010000 | 16 | 10 | DLE (data link escape) | 数据链路转义 |
00010001 | 17 | 11 | DC1 (device control 1) | 设备控制1 |
00010010 | 18 | 12 | DC2 (device control 2) | 设备控制2 |
00010011 | 19 | 13 | DC3 (device control 3) | 设备控制3 |
00010100 | 20 | 14 | DC4 (device control 4) | 设备控制4 |
00010101 | 21 | 15 | NAK (negative acknowledge) | 拒绝接收 |
00010110 | 22 | 16 | SYN (synchronous idle) | 同步空闲 |
00010111 | 23 | 17 | ETB (end of trans. block) | 传输块结束 |
00011000 | 24 | 18 | CAN (cancel) | 取消 |
00011001 | 25 | 19 | EM (end of medium) | 介质中断 |
00011010 | 26 | 1A | SUB (substitute) | 替补 |
00011011 | 27 | 1B | ESC (escape) | 溢出 |
00011100 | 28 | 1C | FS (file separator) | 文件分割符 |
00011101 | 29 | 1D | GS (group separator) | 分组符 |
00011110 | 30 | 1E | RS (record separator) | 记录分离符 |
00011111 | 31 | 1F | US (unit separator) | 单元分隔符 |
00100000 | 32 | 20 | (space) | 空格 |
00100001 | 33 | 21 | ! | |
00100010 | 34 | 22 | " | |
00100011 | 35 | 23 | # | |
00100100 | 36 | 24 | $ | |
00100101 | 37 | 25 | % | |
00100110 | 38 | 26 | & | |
00100111 | 39 | 27 | ' | |
00101000 | 40 | 28 | ( | |
00101001 | 41 | 29 | ) | |
00101010 | 42 | 2A | * | |
00101011 | 43 | 2B | + | |
00101100 | 44 | 2C | , | |
00101101 | 45 | 2D | - | |
00101110 | 46 | 2E | . | |
00101111 | 47 | 2F | / | |
00110000 | 48 | 30 | 0 | |
00110001 | 49 | 31 | 1 | |
00110010 | 50 | 32 | 2 | |
00110011 | 51 | 33 | 3 | |
00110100 | 52 | 34 | 4 | |
00110101 | 53 | 35 | 5 | |
00110110 | 54 | 36 | 6 | |
00110111 | 55 | 37 | 7 | |
00111000 | 56 | 38 | 8 | |
00111001 | 57 | 39 | 9 | |
00111010 | 58 | 3A | : | |
00111011 | 59 | 3B | ; | |
00111100 | 60 | 3C | < | |
00111101 | 61 | 3D | = | |
00111110 | 62 | 3E | > | |
00111111 | 63 | 3F | ? | |
01000000 | 64 | 40 | @ | |
01000001 | 65 | 41 | A | |
01000010 | 66 | 42 | B | |
01000011 | 67 | 43 | C | |
01000100 | 68 | 44 | D | |
01000101 | 69 | 45 | E | |
01000110 | 70 | 46 | F | |
01000111 | 71 | 47 | G | |
01001000 | 72 | 48 | H | |
01001001 | 73 | 49 | I | |
01001010 | 74 | 4A | J | |
01001011 | 75 | 4B | K | |
01001100 | 76 | 4C | L | |
01001101 | 77 | 4D | M | |
01001110 | 78 | 4E | N | |
01001111 | 79 | 4F | O | |
01010000 | 80 | 50 | P | |
01010001 | 81 | 51 | Q | |
01010010 | 82 | 52 | R | |
01010011 | 83 | 53 | S | |
01010100 | 84 | 54 | T | |
01010101 | 85 | 55 | U | |
01010110 | 86 | 56 | V | |
01010111 | 87 | 57 | W | |
01011000 | 88 | 58 | X | |
01011001 | 89 | 59 | Y | |
01011010 | 90 | 5A | Z | |
01011011 | 91 | 5B | [ | |
01011100 | 92 | 5C | \ | |
01011101 | 93 | 5D | ] | |
01011110 | 94 | 5E | ^ | |
01011111 | 95 | 5F | _ | |
01100000 | 96 | 60 | ` | |
01100001 | 97 | 61 | a | |
01100010 | 98 | 62 | b | |
01100011 | 99 | 63 | c | |
01100100 | 100 | 64 | d | |
01100101 | 101 | 65 | e | |
01100110 | 102 | 66 | f | |
01100111 | 103 | 67 | g | |
01101000 | 104 | 68 | h | |
01101001 | 105 | 69 | i | |
01101010 | 106 | 6A | j | |
01101011 | 107 | 6B | k | |
01101100 | 108 | 6C | l | |
01101101 | 109 | 6D | m | |
01101110 | 110 | 6E | n | |
01101111 | 111 | 6F | o | |
01110000 | 112 | 70 | p | |
01110001 | 113 | 71 | q | |
01110010 | 114 | 72 | r | |
01110011 | 115 | 73 | s | |
01110100 | 116 | 74 | t | |
01110101 | 117 | 75 | u | |
01110110 | 118 | 76 | v | |
01110111 | 119 | 77 | w | |
01111000 | 120 | 78 | x | |
01111001 | 121 | 79 | y | |
01111010 | 122 | 7A | z | |
01111011 | 123 | 7B | { | |
01111100 | 124 | 7C | | | |
01111101 | 125 | 7D | } | |
01111110 | 126 | 7E | ~ | |
01111111 | 127 | 7F | DEL (delete) | 删除 |
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

