近期搞一个com口传输的小项目,原来认为是一个挺简单的一个小功能,结果生产商发来com以后直接傻眼了,还要对相关的硬件流进行处理 如下
// 硬件流控制设置
dcb.fOutxCtsFlow = FALSE;
dcb.fRtsControl = FALSE;
// XON/XOFF流控制设置
dcb.fInX = TRUE;
//发送端(DEV)FALSE,接收端(PC):TRUE
dcb.fOutX = FALSE; //发送端(DEV)TRUE,接收端(PC):FALSE
dcb.XonChar = XON;
dcb.XoffChar = XOFF;
dcb.XonLim = 3000; //接收(输入)缓冲区未用空间大于3000,发送XON,允许发送。
dcb.XoffLim =1000; //接收(输入)缓冲区已接收字符大于1000,发送XOFF,禁止发送。
然后看了以后发现c#里面根本就没有这一块的设计,看到网上有一个NetSerialComm的控件,应该是微软自己封装的com口接受程序,感觉还不错,比较符合我们自己的需求,但是跟我们平时使用的方式不太一样,所以在此写一下
public class BaseTerm : CommBase //需要自己写一个类来继承,否则的话commbase是抽象类无法处理
{ public static BaseTerm term; public static CommBaseSettings settings; //settings是必须要的,在设置的时候,使用重载来加载数据的基本设置
public void initCom() { if (settings==null) { settings = new CommBaseSettings(); } if (term==null) { term = new BaseTerm(); } //设置波特率等 BaseTerm.settings.SetStandard("COM1", 115200, CommBase.Handshake.XonXoff); BaseTerm.settings.rxFlowX = false; BaseTerm.settings.useDTR = HSOutput.none; BaseTerm.settings.useRTS = HSOutput.none; if (BaseTerm.term.Open()) { Console.WriteLine("串口打开了"); } else { Console.WriteLine("串口打失败"); } } //收取到的数据将在OnRxChar的里面增加 protected override void OnRxChar(byte c) { string s; bool nl = false; ASCII v = (ASCII)c; Console.WriteLine(c.ToString("X")); } //这个地方的设置最重要,否则数据将不会返回
protected override CommBaseSettings CommSettings() { return settings; } }
当时处理的时候,卡到了几个地方,一个就是重载数据获取这块,另外一个就是设置的处理,需要重载那个CommSettings
这样处理完了就可以直接使用了!