简单的说几句:打算记录做项目时遇到的问题,以便以后少走弯路。工程中经常会用到串口通信,一般就是PC与某个设备间的通信,即PC端按照某种特定的格式(称为协议),往设备发数据,设备接收到数据后返回给PC一个字符串。最近再看《解密》,类似一种加密解密过程。
串口使用很像读写文件,MFC中就是使用ReadFile和WriteFile 来读写串口的,串口使用的大致流程 打开串口 -> 发送数据 ->接收数据 ->关闭串口
C#中已经封装好了该接口,调用起来很方便。
1.打开串口
//初始化串口
public void Init(XXXXXXFrom from, string commName = "COM3", int commBaudRate = 115200, int commDataBits = 8)
{
this.parentFrom = from;//用于输出LOG到的界面
this.commForDtu = new System.IO.Ports.SerialPort();
this.builder = new StringBuilder();//避免在事件处理方法中反复的创建,定义到外面。
//串口配置
this.commForDtu.PortName = commName;
this.commForDtu.BaudRate = commBaudRate;
this.commForDtu.DataBits = commDataBits;
try
{
this.AddLog("打开串口...");//自己封装一个this.parentFrom.AddLog(strLog);
this.commForDtu.Open();//打开串口
}
catch (System.Exception ex)
{
this.AddLog(String.Format("打开串口失败!错误为【{0}】",ex.Message));
}
//添加数据接收事件
this.commForDtu.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(this.OnDataReceived);
}
2.发送数据 public void SendMessage(string strData)
{
if (String.IsNullOrEmpty(strData)) return;
try
{
this.AddLog("发送串口数据...");
byte[] bs = Encoding.ASCII.GetBytes(strData);
this.commForDtu.Write(bs,0, bs.Length);//发送数据
}
catch (Exception ex)
{
//发送数据失败
this.AddLog(String.Format("发送串口数据失败!错误为{0}", ex.Message));
}
}
private void OnDataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
int n = this.commForDtu.BytesToRead;
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
this.commForDtu.Read(buf, 0, n);//读取缓冲数据
this.builder.Clear();//清除字符串构造器的内容
builder.Append(Encoding.ASCII.GetChars(buf));
//接收到数据
{
this.AddLog(builder.ToString());
if (builder.ToString() == Constants.ServerNeedNewData)
{
//发送最新数据
}
}
}
catch (Exception ex)
{
//接收数据失败
this.AddLog(String.Format("读取串口数据失败!错误为{0}", ex.Message));
}
}
项目中遇到过的问题
1. 串口通常是PC端串口(就是串口的小孔和针)的235 接设备的235,有的设备搞特殊,内部将23对调,如果不换线的的话 就变成了,数据可能就发不过去了
2. 串口发送接收数据可能不稳,尤其是温度比较高或者震动比较的环境,有一款可以增强串口稳定性的(忘了不知道叫什么了),可以实现串口数据的稳定
3. 之前做MFC时,串口数据可能不是一个包发过来 例如 设备发过来5201314,可能需要读取两次 第一次为520131,第二次为4,所以做法就是一直读到7个字节再处理,不知道C#有没有这样的问题
待添加。。。