34人参与 • 2025-08-13 • Asp.net
1.串口通信协议简介
串口通信(serial communication)
是一种设备间非常常用的串行通信方式,大部分电子设备都支持,电子工程师再调试设备时也经常使用该通信方式输出调试信息。讲到某一种通信协议,离不开的就是物理层,物理层主要表现形式是电平信号的高低幅值,分别代表的状态。 串口的物理层有很多标准,主要包含rs232标准
,该标准规定了信号的用途、通信接口以及信号的电平标准;
在上面的通讯方式中,两个通讯设备的“db9接口”之间通过串口信号线建立起连接,串口信号线中使用“rs-232标准”传输数据信号。
由于rs-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个“电平转换芯片”转换成控制器能识别的“ttl校准”的电平信号,才能实现通讯。
电平标准
根据通信使用的电平标准不同,串口通信可以分为ttl标准和rs232标准
我们常见的电子电路中使用的ttl电平标准,理想状态下,使用5v表示二级制逻辑1,使用0v表示逻辑0,而为了增加串口通信的远距离传输以及抗干扰能力,它使用-15v表示逻辑1,+15v表示逻辑0,使用rs232与ttl电平标准表示同一个信号时的对比见图
因为控制器一般使用ttl电平标准,所以常常会使用ma3232芯片对ttl以及rs232电平信号进行互相转换。
rs-232信号线 在最初的应用中,rs-232串口标准常用于计算机、路由与调制调解器(moden,俗称“猫”)之间的通讯 ,在这种通讯系统中,设备被分为数据终端设备dte(计算机、路由)和数据通讯设备dce(调制调解器)。我们以这种通讯模型讲解它们的信号线连接方式及各个信号线的作用。
在旧式的台式计算机中一般会有rs-232标准的com口(也称db9接口)
其中接线口以针式引出信号线的称为公头,以孔式引出信号线的称为母头。在计算机中一般引出公头接口,而在调制调解器设备中引出的一般为母头,使用上图中的串口线即可把它与计算机连接起来。通讯时,串口线中传输的信号就是使用前面讲解的rs-232标准调制的。
在这种应用场合下,db9接口中的公头及母头的各个引脚的标准信号线接法见图
上表中的是计算机端的db9公头标准接法,由于两个通讯设备之间的收发信号(rxd与txd)应交叉相连,所以调制调解器端的db9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用“直通型”的串口线连接起来即可
串口线中的rts、cts、dsr、dtr及dcd信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制dtr信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。
在目前的其它工业控制使用的串口通讯中,一般只使用rxd、txd以及gnd三条信号线,直接传输数据信号。而rts、cts、dsr、dtr及dcd信号都被裁剪掉了,如果您在前面被这些信号弄得晕头转向,那就直接忽略它们吧。
协议层
串口通讯的数据包由发送设备通过自身的txd接口传输到接收设备的rxd接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据,其组成见下图。
波特率
在串口异步通讯中由于没有时钟信号(如前面讲解的db9接口中是没有时钟信号的),所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码常见的波特率为4800、9600、115200等。
在无校验的情况下,数据包中不包含校验位。
serialport类的常用api:
属性:
常用方法
常用事件
代码示例:
using system.io.ports; using system.text; namespace serialportcommunication { class program { private static serialport serialport; public static void main() { #region 串口通信 connectserialport("com2"); closeport(); recivedata(); senddata(); console.readkey(); #endregion } /// <summary> /// 接收串口数据 /// </summary> /// <exception cref="notimplementedexception"></exception> private static void recivedata() { // 连接串口 var result = connectserialport("com2"); while(true) { if (result) { // bytestoread 代表串口中的字节大小 // 串口中的数据接收后,数据就被移除了。 var buffer = new byte[serialport.bytestoread]; // 接收发送的数据 #region 主动接收 serialport.read(buffer, 0, buffer.length); var resultstring = encoding.utf8.getstring(buffer, 0, buffer.length); console.writeline($"接收到结果: {resultstring}"); } } serialport.close(); #endregion } /// <summary> /// 发送数据的方法 /// </summary> /// <exception cref="notimplementedexception"></exception> private static void senddata() { // 连接串口 var result = connectserialport("com1"); if (result) { // 发送数据 //serialport.write("hello serialport"); //var buffer = new byte[] { 0x01, 0x02,0x03 }; // 发送数据 var buffer = encoding.utf8.getbytes("中文"); serialport.write(buffer, 0, buffer.length); //serialport.writebuffersize = 65535; // modbus 250 //serialport.writeline("don't type chinese"); } serialport.close(); } /// <summary> /// 关闭串口的方法 /// </summary> /// <exception cref="notimplementedexception"></exception> private static void closeport() { if (serialport == null) { return; } serialport.close(); } /// <summary> /// 连接串口的方法 /// </summary> /// <returns></returns> private static bool connectserialport(string portname) { // 创建串口对象 serialport = new serialport(); // 设置连接串口名称 serialport.portname = portname; // 设置波特率 serialport.baudrate = 9600; // 设置数据位 serialport.databits = 8; // 设置停止位 serialport.stopbits = stopbits.one; // 设置校验位 serialport.parity = parity.none; serialport.datareceived += serialport_datareceived; // 打开串口 serialport.open(); // 判断串口是否成功打开 if (serialport.isopen) { console.writeline("串口连接成功"); return true; } else { console.writeline("串口连接失败"); } return false; } /// <summary> /// 接收事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> /// <exception cref="notimplementedexception"></exception> private static void serialport_datareceived(object sender, serialdatareceivedeventargs e) { var serialport1 = sender as serialport; var buffer = new byte[serialport1!.bytestoread]; serialport1.read(buffer, 0, buffer.length); var resultstring = encoding.utf8.getstring(buffer, 0, buffer.length); console.writeline($"接收到结果: {resultstring}"); } } }
到此这篇关于使用c#进行串口通信的实现示例的文章就介绍到这了,更多相关c# 串口通信内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论