搜索
bottom↓
回复: 9

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

[复制链接]

出0入0汤圆

发表于 2019-4-17 10:27:54 | 显示全部楼层 |阅读模式
           希望实现功能:按钮实现创建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;

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 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[count];
                        try
                        {
                            Application.DoEvents();
                            serialPort.Read(readBuffer, 0, count);
                            List<byte> list = new List<byte>();
                            for (int i = 0; i < count; i++)
                            {
                                if (((readBuffer[i] >= 0x20) && (readBuffer[i] <= 0x7e)) || (readBuffer[i] == 0x0a || readBuffer[i] == 0x0d))
                                {
                                    list.Add(readBuffer[i]);
                                }
                            }
                            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[i]);
            }
            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);//开始写入值
            }
        }

出0入0汤圆

发表于 2019-4-19 07:10:11 来自手机 | 显示全部楼层
写了之后要刷新才会真正立即写入文件。

出0入0汤圆

发表于 2019-4-19 08:26:23 | 显示全部楼层

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

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

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

出0入0汤圆

发表于 2019-4-19 10:54:32 | 显示全部楼层
是我的话,我会先写入大尺寸的buffer, 程序关闭时或者定时一段时间才自动保存到TXT文件。

出0入0汤圆

发表于 2019-4-19 13:50:40 | 显示全部楼层
pursuits 发表于 2019-4-17 14:14
可以先写一个串口通讯的类,把接收到的数据实时传出来。
public class SerialManage
    {


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




出0入0汤圆

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

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

出0入0汤圆

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

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

出0入0汤圆

发表于 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

出0入0汤圆

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

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

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 12:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表