linux 串口数据 监听,怎样监听或者拦截串口上的数据

串口全称为串行接口,一般指COM接口,是采用串行通信方式的扩展接口。其特点是数据位的传送按位顺序进行,最少只需一根传输线即可完成,成本低但传送速度慢。由于串口(COM)不支持热插拔及传输速率较低,目前部分新主板和大部分便携电脑已取消该接口。现在串口多用于工业控制和测量设备以及部分通信设备中。

根据美国电子工业协会(EIA: Electronic Industry AssociaTIon)制定的标准,串口可以分为RS-232、RS-422以及RS-485等种类,其中以RS-232类型的接口最为典型和常见,如图 1所示,是RS-232类型9针串口的实物示意图。RS-232类型9针串口每一个引脚的作用说明如图 2所示。

d631d333afb2e942e3546072824c1490.png

c04c22a801694f14eb9877b53094dce7.png

当需要编程操纵硬件时会遇到过这样的问题,就是通过串口来接收硬件发来的数据,或是通过串口向硬件发送某种格式的命令。在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(@“HARDWARE\DEVICEMAP\SERIALCOMM”);

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 串口监听

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值