C#学习【 串口学习】

简单的说几句:打算记录做项目时遇到的问题,以便以后少走弯路。工程中经常会用到串口通信,一般就是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));
            }
        }


3.接收数据

          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#有没有这样的问题

待添加。。。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章