串口全称为串行接口,一般指COM接口,是采用串行通信方式的扩展接口。其特点是数据位的传送按位顺序进行,最少只需一根传输线即可完成,成本低但传送速度慢。由于串口(COM)不支持热插拔及传输速率较低,目前部分新主板和大部分便携电脑已取消该接口。现在串口多用于工业控制和测量设备以及部分通信设备中。
根据美国电子工业协会(EIA: Electronic Industry Association)制定的标准,串口可以分为RS-232、RS-422以及RS-485等种类,其中以RS-232类型的接口最为典型和常见,如图 1所示,是RS-232类型9针串口的实物示意图。RS-232类型9针串口每一个引脚的作用说明如图 2所示。
当需要编程操纵硬件时会遇到过这样的问题,就是通过串口来接收硬件发来的数据,或是通过串口向硬件发送某种格式的命令。在C#平台上,可以通过 System.IO.Ports 命名空间下的SerialPort 类来实现。
下面是我做过的一个简单的示例,首先获取本机关联的串行端口列表,然后获取配置文件中配置的COM端口,检查是否在本机串行端口列表中,若在列表中则进一步实例化串口对象,并为串口对象指定数据接收事件来实现监听,示例代码如下:
using System.IO.Ports;
namespace SerialTest
{
public class SerialTest
{
#region 串口监听
private SerialPort serialPort = null;
/// 《summary》
/// 开启串口监听
/// 《/summary》
private void StartSerialPortMonitor()
{
List《string》 comList = GetComlist(false); //首先获取本机关联的串行端口列表
if (comList.Count == 0)
{
DialogForm.Show(“提示信息”, “当前设备不存在串行端口!”);
System.Environment.Exit(0); //彻底退出应用程序
}
else
{
string targetCOMPort = ConfigurationManager.AppSettings[“COMPort”].ToString();
//判断串口列表中是否存在目标串行端口
if (!comList.Contains(targetCOMPort))
{
DialogForm.Show(“提示信息”, “当前设备不存在配置的串行端口!”);
System.Environment.Exit(0); //彻底退出应用程序
}
serialPort = new SerialPort();
//设置参数
serialPort.PortName = ConfigurationManager.AppSettings[“COMPort”].ToString(); //通信端口
serialPort.BaudRate = Int32.Parse(ConfigurationManager.AppSettings[“BaudRate”].ToString()); //串行波特率
serialPort.DataBits = 8; //每个字节的标准数据位长度
serialPort.StopBits = StopBits.One; //设置每个字节的标准停止位数
serialPort.Parity = Parity.None; //设置奇偶校验检查协议
serialPort.ReadTimeout = 3000; //单位毫秒
serialPort.WriteTimeout = 3000; //单位毫秒
//串口控件成员变量,字面意思为接收字节阀值,
//串口对象在收到这样长度的数据之后会触发事件处理函数
//一般都设为1
serialPort.ReceivedBytesThreshold = 1;
serialPort.DataReceived += new SerialDataReceivedEventHandler(CommDataReceived); //设置数据接收事件(监听)
try
{
serialPort.Open(); //打开串口
}
catch (Exception ex)
{
DialogForm.Show(“提示信息”, “串行端口打开失败!具体原因:” + ex.Message);
System.Environment.Exit(0); //彻底退出应用程序
}
}
}
/// 《summary》
/// 串口数据处理函数
/// 《/summary》
/// 《param name=“sender”》《/param》
/// 《param name=“e”》《/param》
public void CommDataReceived(Object sender, SerialDataReceivedEventArgs e)
{
try
{
//Comm.BytesToRead中为要读入的字节长度
int len = serialPort.BytesToRead;
Byte[] readBuffer = new Byte[len];
serialPort.Read(readBuffer, 0, len); //将数据读入缓存
//处理readBuffer中的数据,自定义处理过程
string msg = encoding.GetString(readBuffer, 0, len); //获取出入库产品编号
DialogForm.Show(“接收到的信息”, msg);
}
catch(Exception ex)
{
DialogForm.Show(“提示信息”, “接收返回消息异常!具体原因:” + ex.Message);
}
}
/// 《summary》
/// 关闭串口
/// 《/summary》
private void Stop()
{
serialPort.Close();
}
/// 《summary》
/// 获取本机串口列表
/// 《/summary》
/// 《param name=“isUseReg”》《/param》
/// 《returns》《/returns》
private List《string》 GetComlist(bool isUseReg)
{
List《string》 list = new List《string》();
try
{
if (isUseReg)
{
RegistryKey RootKey = Registry.LocalMachine;
RegistryKey Comkey = RootKey.OpenSubKey(@“HARDWAREDEVICEMAPSERIALCOMM”);
String[] ComNames = Comkey.GetValueNames();
foreach (String ComNamekey in ComNames)
{
string TemS = Comkey.GetValue(ComNamekey).ToString();
list.Add(TemS);
}
}
else
{
foreach (string com in SerialPort.GetPortNames()) //自动获取串行口名称
list.Add(com);
}
}
catch
{
DialogForm.Show(“提示信息”, “串行端口检查异常!”);
System.Environment.Exit(0); //彻底退出应用程序
}
return list;
}
#endregion 串口监听
}
}
评论
查看更多