[netMarketing类库] serialHelper类:串口辅助类(RS232/485)

命名空间: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的朋友,在其串设置里面,有这样一个设置
image.png
实际上后面两项就是用来设置结束码的。

下面的例子里结束为\r

image.png

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'。

另外还有一些单字节常用转义符列举如下:

  1. \' 单引号 0x0027

  2. \" 双引号 0x0022

  3. \\ 反斜杠 0x005C

  4. \0 空 0x0000

  5. \a 警报(感叹号) 0x0007

  6. \b 退格符 0x0008

  7. \f 换页符 0x000C

  8. \n 换行符 0x000A

  9. \r 回车 0x000D

  10. \t 水平制表符 0x0009

  11. \v 垂直制表符 0x000B

ASCII码表

BinDecHex缩写/字符解释
00000000000NUL(null)空字符
00000001101SOH(start of headling)标题开始
00000010202STX (start of text)正文开始
00000011303ETX (end of text)正文结束
00000100404EOT (end of transmission)传输结束
00000101505ENQ (enquiry)请求
00000110606ACK (acknowledge)收到通知
00000111707BEL (bell)响铃
00001000808BS (backspace)退格
00001001909HT (horizontal tab)水平制表符
00001010100ALF (NL line feed, new line)换行键
00001011110BVT (vertical tab)垂直制表符
00001100120CFF (NP form feed, new page)换页键
00001101130DCR (carriage return)回车键
00001110140ESO (shift out)不用切换
00001111150FSI (shift in)启用切换
000100001610DLE (data link escape)数据链路转义
000100011711DC1 (device control 1)设备控制1
000100101812DC2 (device control 2)设备控制2
000100111913DC3 (device control 3)设备控制3
000101002014DC4 (device control 4)设备控制4
000101012115NAK (negative acknowledge)拒绝接收
000101102216SYN (synchronous idle)同步空闲
000101112317ETB (end of trans. block)传输块结束
000110002418CAN (cancel)取消
000110012519EM (end of medium)介质中断
00011010261ASUB (substitute)替补
00011011271BESC (escape)溢出
00011100281CFS (file separator)文件分割符
00011101291DGS (group separator)分组符
00011110301ERS (record separator)记录分离符
00011111311FUS (unit separator)单元分隔符
001000003220(space)空格
001000013321!
001000103422"
001000113523#
001001003624$
001001013725%
001001103826&
001001113927'
001010004028(
001010014129)
00101010422A*
00101011432B+
00101100442C,
00101101452D-
00101110462E.
00101111472F/
0011000048300
0011000149311
0011001050322
0011001151333
0011010052344
0011010153355
0011011054366
0011011155377
0011100056388
0011100157399
00111010583A:
00111011593B;
00111100603C<
00111101613D=
00111110623E>
00111111633F?
010000006440@
010000016541A
010000106642B
010000116743C
010001006844D
010001016945E
010001107046F
010001117147G
010010007248H
010010017349I
01001010744AJ
01001011754BK
01001100764CL
01001101774DM
01001110784EN
01001111794FO
010100008050P
010100018151Q
010100108252R
010100118353S
010101008454T
010101018555U
010101108656V
010101118757W
010110008858X
010110018959Y
01011010905AZ
01011011915B[
01011100925C\
01011101935D]
01011110945E^
01011111955F_
011000009660`
011000019761a
011000109862b
011000119963c
0110010010064d
0110010110165e
0110011010266f
0110011110367g
0110100010468h
0110100110569i
011010101066Aj
011010111076Bk
011011001086Cl
011011011096Dm
011011101106En
011011111116Fo
0111000011270p
0111000111371q
0111001011472r
0111001111573s
0111010011674t
0111010111775u
0111011011876v
0111011111977w
0111100012078x
0111100112179y
011110101227Az
011110111237B{
011111001247C|
011111011257D}
011111101267E~
011111111277FDEL (delete)删除

--------------------- 

作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

返回类库功能说明目录


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864