c#串口通讯类(基于C#实现串口通讯)
c#串口通讯类(基于C#实现串口通讯)
2024-09-28 10:38:10  作者:明知故犯  网址:https://m.xinb2b.cn/tech/bbu283895.html

工控机通常都带有很多串口(10个),而且可以通过Moxa卡扩展串口. 但Moxa的串口和电脑自带的串口还是有点区别 C#里面没区别, 但之前VB6的MSComm控件有时就会有不一样的地方.

支持串口通讯的仪表,通常通讯指令分2种,一种是文本格式的,另一种是16进制格式的.文本格式的,比如说有些仪器,查版本号发 *IDN? 就会返回文本格式的结果,例如 XXX 8905,502-H19-1449,V1.38.02.18A2

16进制通讯的,比如青智的电流表,查询电流用的命令格式 01是仪表地址, 03是读取的命令.1000是寄存器开始地址,000A是读取长度, C10D是CRC校验码(多数使用CRC,也有仪器使用和校验的)

青智

还有一种仪器是自带MCU,就是一打开串口就自动上传数据给上位机, 这种就不需要命令了.只需要定时读取串口缓冲区的内容,按照报文的格式,分析出哪一段数据才是你需要的.

我常用的串口通讯工具有下面2个

在Github下载一个ComDBG的工具,这个是C#写的,可以自己根据代码扩展需要的功能,比如历史发送记录


另外可以用一个监控工具,串口监控精灵, 这个对于那些没有代码的exe(比如一些仪表自带有一些小软件), 我们直接监控某个串口的收发信息.就知道对应的命令是什么了.


我通常把串口通讯做成一个基类, 把打开/关闭串口,文本命令,16进制命令,CRC校验,和校验都写到基类了,方便调用


下面是部分方法的代码

public bool InitCom(int portNum,int BaudRate =9600)        {            //端口打开时无法设置“PortName”            if (!sp.IsOpen)                sp.PortName = "COM" + portNum.ToString();            else            {                if (sp.PortName != "COM" + portNum.ToString())                {sp.Close();sp.PortName = "COM" + portNum.ToString();                }            }            sp.BaudRate = BaudRate;//波特率            sp.Parity = Parity.None;//无奇偶校验位            sp.StopBits = StopBits.One;//两个停止位            sp.Handshake = Handshake.None;//控制协议            sp.WriteTimeout = 1000;             sp.ReceivedBytesThreshold = 1;//设置 DataReceived 事件发生前内部输入缓冲区中的字节数            return true;        }

//把一串命令,默认是文本string命令, 也可能是十六进制的数(空格分开),发到串口        protected bool SerialPortCmd(string command,ref string recvMsg,             int iDelay = 100, int RecvMsgLenParm= 2,bool IsCmdText =true)        {            DelaySec = iDelay;            RecvMsgLen = RecvMsgLenParm;             if (!openCom())                return false;            try            {                byte[] bytes;                if (IsCmdText)bytes = Encoding.Default.GetBytes(command);                elsebytes = HexStringToBytes(command);                sp.Write(bytes, 0, bytes.Length);            }            catch (Exception ex)            {                Debug.Write(ex.ToString());                return false;   //write failed            }            return DataReceived(IsCmdText, ref recvMsg);   }

private bool DataReceived(bool IsResultText,ref string result)        {            //Thread Safety explain in MSDN:            // Any public static (Shared in Visual Basic) members of this type are thread safe.             // Any instance members are not guaranteed to be thread safe.            // So, we need to synchronize I/O            lock (thisLock)            {                string RecvMsgBuffer;                int len = sp.BytesToRead;      if (len >= RecvMsgLen) //返回长度足够了.                {Byte[] data = new Byte[len];try{    sp.Read(data, 0, len);}catch (Exception ex){    throw ex;}if (IsResultText)    RecvMsgBuffer = Encoding.Default.GetString(data);else    RecvMsgBuffer = BytesToHexString(data);  result = RecvMsgBuffer;return true;                }                elsereturn false;            }        }

  • 镜花缘的书好看吗(1分钟了解一本书镜花缘)
  • 2024-09-291分钟了解一本书镜花缘小时候的科幻读物,十分有趣《镜花缘》是清代文人李汝珍创作的长篇小说小说前半部分描写了唐敖、多九公等人乘船在海外游历的故事,包括他们在女儿国、君子国、无肠国等国的经历史后半部写了武则天科举选才女,由百花。
  • 盘点10位最漂亮的明星(这些拥有美人尖的明星们)
  • 2024-09-29这些拥有美人尖的明星们关于美人尖,最令人印象深刻的就是白素贞的造型了,剧中她的发际呈现了一个完美的弧线,显得脸庞精致,仪态端庄,喏,就是这样:可惜赵雅芝随着年岁渐长,发际线上移,美人尖最终消失了娱乐圈拥有美人尖的女星有多少。
  • 阳光姐妹淘有谁
  • 2024-09-29阳光姐妹淘有谁这是一部关于友谊和成长的温情片高中时的阳光七姐妹多年后重聚七个成员分别是:成年张丽君(殷桃饰)成年林青(曾黎饰)成年黄小娟(张韵艺饰)成年杨梅(马苏饰)成年邱玉红(倪虹洁饰)成年朱珠(蒋小涵饰)少女李。
  • 长驱直入是什么意思(长驱直入意思简述)
  • 2024-09-29长驱直入意思简述长驱直入,汉语词语,拼音是chángqūzhírù驱:打着马前进意思是迅速向很远的目的地前进形容进军迅猛顺利用来表示军队以不可阻挡之势向前挺进,深入敌方心脏[出处]明·施耐庵《水浒传》第一百零七回:“。
  • 秋季喝什么润肺降燥汤广东(秋季喝这种汤清热润肺)
  • 2024-09-29秋季喝这种汤清热润肺金风送爽,莲藕飘香秋季煮上一碗莲藕汤,味美又滋润!莲藕熟吃最养人中医认为,熟藕味甘,性温和,有补心生血、健脾开胃、滋养强壮之功用,煮汤饮用能通利小便、清热润肺,为衰老、虚弱、久病之人的理想调养食品《本。
  • 享受独处的安静是真正的修心境界(通往高维空间的途径)
  • 2024-09-29通往高维空间的途径01“中年人如何能够提升自己的思维维度?感觉自己现在眼界和思维不够开阔”这是知乎里一位知友提出的问题,当日浅薄,做了几句敷衍的回答,自觉惭愧思来想去,想到这位知友提出的思维维度与北大教授刘丰谈及的思维。
  • 95后出任董事长(幕后老板是个95后)
  • 2024-09-29幕后老板是个95后封面新闻记者宋潇和陌生网友见一面吃顿烤肉,就花了几千上万元,当心,这很可能是“酒托女”设下的陷阱10月14日,记者从裁判文书上获悉,在今年3月,成都市中级人民法院就审理了一起涉及24名女性以交友为名实。
  • 泊船瓜洲诗意是什么(泊船瓜洲赏析)
  • 2024-09-29泊船瓜洲赏析北宋王安石《泊船瓜洲》的诗意:站在瓜洲渡口,放眼南望,京口和瓜洲之间只隔着一条长江,我所居住的钟山隐没在几座山峦的后面暖和的春风又一次吹绿了江南的田野,明月什么时候才能照着我回到钟山下的家里?《泊船瓜。
  • 小蘑菇不焯水直接煮可以吗(蘑菇煮汤别直接放入沸水中)
  • 2024-09-29蘑菇煮汤别直接放入沸水中蘑菇可以说是四季食材,每个季节都能吃到,因为蘑菇的生长不受光照的限制菌菇类的食材生长是没有经过光合作用的生物合成过程,因此它天然合成的这种特殊的成分,特别是当中的一些医学营养成分,更加有利于增强体质中。