陶新成 发表于 2019-4-17 10:27:54

C#小白 串口数据实时存入TXT文件问题请教

         希望实现功能:按钮实现创建TXT文件,串口实时存入创建的TXT文件内
          下面的代码可以实现的功能是创建TXT文件和保存 textRecvRegion中的内容,但是在串口引用函数中如何实时存入串口数据不太清除。
         System.IO.FileStream objfile;
            saveFileDialog1.ShowDialog();
            objfile = System.IO.File.Create(@saveFileDialog1.FileName);
            objfile.Close();
            objfile.Dispose();
            System.IO.StreamWriter objfil = new System.IO.StreamWriter(@saveFileDialog1.FileName);
            objfil.Write(textRecvRegion.Text);
            objfil.Close();
            objfil.Dispose();
            this.textBox1.Text = @saveFileDialog1.FileName;

pursuits 发表于 2019-4-17 14:14:29

可以先写一个串口通讯的类,把接收到的数据实时传出来。
public class SerialManage
    {
      public delegate void EventHandle(byte[] readBuffer);
      public event EventHandle DataReceived;

      private SerialPort serialPort;
      Thread thread;
      volatile bool _keepReading;

      public SerialManage()
      {
            serialPort = new SerialPort();
            thread = null;
            _keepReading = false;
      }

      public bool IsOpen
      {
            get
            {
                return serialPort.IsOpen;
            }
      }

      /// <summary>
      /// 开始接收数据
      /// </summary>
      private void StartReading()
      {
            if (!_keepReading)
            {
                _keepReading = true;
                thread = new Thread(new ThreadStart(ReadThread));
                thread.IsBackground = true;
                thread.Start();
            }
      }

      /// <summary>
      /// 停止接收数据
      /// </summary>
      private void StopReading()
      {
            if (_keepReading)
            {
                _keepReading = false;
                thread.Join(1000);
                thread = null;
            }
      }

      /// <summary>
      /// 接收线程
      /// </summary>
      private void ReadThread()
      {
            while (_keepReading)
            {
                if (serialPort.IsOpen)
                {
                  int count = serialPort.BytesToRead;
                  if (count > 0)
                  {
                        byte[] readBuffer = new byte;
                        try
                        {
                            Application.DoEvents();
                            serialPort.Read(readBuffer, 0, count);
                            List<byte> list = new List<byte>();
                            for (int i = 0; i < count; i++)
                            {
                              if (((readBuffer >= 0x20) && (readBuffer <= 0x7e)) || (readBuffer == 0x0a || readBuffer == 0x0d))
                              {
                                    list.Add(readBuffer);
                              }
                            }
                            if (DataReceived != null)
                              DataReceived(list.ToArray());
                            //Thread.Sleep(1);
                        }
                        catch (TimeoutException)
                        {
                        }
                  }
                }
            }
      }

      /// <summary>
      /// 打开串口
      /// </summary>
      /// <param name="portName"></param>
      /// <param name="baudRate"></param>
      public bool Open(string portName, string baudRate)
      {
            Close();
            serialPort.PortName = portName;
            serialPort.BaudRate = int.Parse(baudRate);
            serialPort.Open();
            if (serialPort.IsOpen)
            {
                StartReading();
            }
            else
            {
                XtraMessageBox.Show("串口打开失败!");
                return false;
            }
            return true;
      }

      /// <summary>
      /// 关闭串口
      /// </summary>
      public void Close()
      {
            StopReading();
            if (IsOpen)
            {
                serialPort.Close();
            }
      }

      /// <summary>
      /// 发送字节数组
      /// </summary>
      /// <param name="send">待发送数组</param>
      /// <param name="offSet">起始位置</param>
      /// <param name="count">发送数量</param>
      public void WritePort(byte[] send, int offSet, int count)
      {
            if (IsOpen)
            {
                serialPort.Write(send, offSet, count);
            }
      }

      /// <summary>
      /// 发送字符串
      /// </summary>
      /// <param name="send"></param>
      public void WritePort(string send)
      {
            if (IsOpen)
            {
                serialPort.Write(send);
            }
      }

      /// <summary>
      /// 发送字符串+换行
      /// </summary>
      /// <param name="send"></param>
      public void WriteLinePort(string send)
      {
            if (IsOpen)
            {
                serialPort.WriteLine(send);
            }
      }
    }




使用方法:
serialCom = new SerialManage();
serialCom.DataReceived += serialPort_DataReceived;
serialCom.Open(PortName, BaudRate);

   private void serialPort_DataReceived(byte[] readBuffer)
      {
            List<byte> list = new List<byte>();
            for (int i = 0; i < readBuffer.Length; i++)
            {
                MyStateMachine.ReadChange(readBuffer);
            }
            string read_s = Encoding.ASCII.GetString(readBuffer);
            WriteResult(read_s);
      }

public void WriteResult(string result)
      {
            string fileName = @".\result\"+ DateTime.Now.ToString("D") + "串口数据.txt";
            string directoryName = Path.GetDirectoryName(fileName);
            if (!Directory.Exists(directoryName))
            {
                Directory.CreateDirectory(directoryName);
            }
            using (StreamWriter sw = new StreamWriter(fileName, true, Encoding.UTF8))
            {
                sw.WriteLine(result);//开始写入值
            }
      }

sunny_82 发表于 2019-4-19 07:10:11

写了之后要刷新才会真正立即写入文件。

zyqcome 发表于 2019-4-19 08:26:23

{:shocked:}
创建工具类的时候,创建文件写入对象,打开写入

串口事件 ---> 写入文件

逻辑结束 ----> 关闭文件写入

ANHOME 发表于 2019-4-19 10:54:32

是我的话,我会先写入大尺寸的buffer, 程序关闭时或者定时一段时间才自动保存到TXT文件。

kinsno 发表于 2019-4-19 13:50:40

pursuits 发表于 2019-4-17 14:14
可以先写一个串口通讯的类,把接收到的数据实时传出来。
public class SerialManage
    {


老铁,我看你把好象把串口操作封到类里面去了。。
万一,用户要在外面操作串口各种功能,保存在文本里只是附带的功能,岂不是脸一黑。。




pursuits 发表于 2019-4-19 16:31:46

kinsno 发表于 2019-4-19 13:50
老铁,我看你把好象把串口操作封到类里面去了。。
万一,用户要在外面操作串口各种功能,保存在文本里只 ...

可能是我没写清楚。
后面的使用方法是在主类里面,串口类里面只有串口的简单操作。

kinsno 发表于 2019-4-19 17:55:04

pursuits 发表于 2019-4-19 16:31
可能是我没写清楚。
后面的使用方法是在主类里面,串口类里面只有串口的简单操作。 ...

请教一下,UI界面即主界面 form1.cs 内部有一个textbox,我另外写了一个类,并单独成一个文件 ymode.cs , 如何在这个ymode.cs内可以去把日志信息写在form1.cs的textbox,这就相当于在另外一个类文件内,跨线程调用控件。。这种你有经验吗,方便指怕一下吗?

pursuits 发表于 2019-4-20 10:01:43

kinsno 发表于 2019-4-19 17:55
请教一下,UI界面即主界面 form1.cs 内部有一个textbox,我另外写了一个类,并单独成一个文件 ymode.cs...

在外面不方便贴代码。你可以看下这个代码。
http://www.huiyaosoft.com/winformlist.htm

HYAppFrame是一款基于Winform的应用程序框架,包含服务器Web Service、主程序框架、组织架构、权限控制、菜单导航、基础数据、系统参数、日志管理、定时任务、工作流引擎等。

地址:sourceforge.net

帐号:admin密码:123456

kinsno 发表于 2019-4-20 10:23:26

pursuits 发表于 2019-4-20 10:01
在外面不方便贴代码。你可以看下这个代码。
http://www.huiyaosoft.com/winformlist.htm



谢谢,代码太大了,我通过别的方法解决了。。。

页: [1]
查看完整版本: C#小白 串口数据实时存入TXT文件问题请教