C#-串口(一)_概念

一、串口与并口的概念:

1、串口(Serial Interface):

  串行接口,指数据一位一位地顺序传递,其特点就是通讯线路简单,只要一对传输线就可以实现双向通讯,从而大大减低了成本,特别适合远距离通讯,但传送速度较慢。

  (1)串口分类:单工、半双工、双全工;

  (2)传输距离控制在15m之内;

  (2)远距离传输需要使用“调制解调器(Modem)”或其他设备;

2、并口(Parallel Interface):

  指采用并行传输方式来传输数据的接口标准。从最简单的一个并行数据寄存器或专用接口集成电路芯片如8255、6820等,一直至较复杂的SCSI或IDE并行接口,种类有数十种。

  (1)以并行方式传输的数据通道的宽度,也称接口传输的位数;

  (2)用于协调并行数据传输的额外接口控制线或称交互信号的特性。 数据的宽度可以从1~128位或者更宽,最常用的是8位,可通过接口一次传送8个数据位。

3、串口与并口:

  串口就像一条车道,而并口就像有8条车道,同时刻能传输8位数据。由于8位通道之间的相互干扰,传输时速度就受到了限制,传输容易出错。串口没有互相干扰,并口能同时发送的数据量较大,但速度比串口慢。

二、接口标准:

1、SPI协议(Serial Perpheral interface):

  同步串口接口;SPI总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通讯,从而交换信息。

2、UART协议:

(1)TTL电平串口:

  

(2)SR-232、SR-422、SR-485电平串口:

  采用DB9线或者DB25线,俗称com线。

  

三、区分RS-232和RS-485协议:

  在RS232协议中,数据传输采用异步传输方式,常见的是1个起始位、8个数据位、无校验位、1个停止位。此外,RS232是单工模式,只能实现单向数据传输,不能同时发送和接收数据。

  在RS485协议中,支持半双工或全双工通信,可以同时进行数据发送和接收。它的物理层标准采用差分信号传输,抗干扰性能较强,并且允许多个设备共用一条总线。RS485数据帧是由起始位、地址码、功能码、数据码及校验码组成,其中地址码可区分多个设备。

  要在项目中区分他俩,需要查看设备厂商定义的手册。下面为C#针对两种协议进行传输的参考代码:

1、RS232 串口通讯

1)引入 System.IO.Ports 命名空间
using System.IO.Ports;
2)创建 SerialPort 实例,并设置相应的属性
SerialPort serialPort = new SerialPort();
serialPort.PortName = "COM1";    // 设置串口号
serialPort.BaudRate = 9600;     // 设置波特率
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Parity = Parity.None;
3)打开串口并进行读写操作
serialPort.Open();              // 打开串口

serialPort.Write("Hello, world!");  // 向串口写数据

string data = serialPort.ReadExisting();   // 从串口读取数据

serialPort.Close();             // 关闭串口

2、RS485 串口通讯

1)确认串口适配器是否支持硬件流控(如:RS485转换器)。
2)修改串口属性,包括停止位、奇偶校验、流控等与 RS485 相关的参数
serialPort.PortName = "COM1";
serialPort.BaudRate = 9600;

// RS485 通讯需要配置的属性
serialPort.Parity = Parity.None;
serialPort.StopBits = StopBits.Two;  // 注意此处为 2 个停止位,可用1、1.5
serialPort.DataBits = 8;
serialPort.Handshake = Handshake.RequestToSend;

// RS485 的读写方式需要特别设置
serialPort.ReadTimeout = 500;   // 读超时
serialPort.WriteTimeout = 500;  // 写超时
serialPort.RtsEnable = true;      // 设置 Request-To-Send 线路为高电平
3)在进行读写操作时留出时间间隔
sp.Open();
byte[] sendMessage = new byte[] { 0x01, 0x02, 0x03, 0x04 };
sp.Write(sendMessage, 0, sendMessage.Length);
Thread.Sleep(100);//发送与接收之间留出时间间隔
byte[] receiveMessage = new byte[sp.BytesToRead];
sp.Read(receiveMessage, 0,
posted @   ꧁执笔小白꧂  阅读(293)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
历史上的今天:
2022-03-10 3D打印机
2021-03-10 Linux-SQLite错误: System.DllNotFoundException: SQLite.Interop.dll\n
点击右上角即可分享
微信分享提示