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; 可以先写一个串口通讯的类,把接收到的数据实时传出来。
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);//开始写入值
}
}
写了之后要刷新才会真正立即写入文件。 {:shocked:}
创建工具类的时候,创建文件写入对象,打开写入
串口事件 ---> 写入文件
逻辑结束 ----> 关闭文件写入 是我的话,我会先写入大尺寸的buffer, 程序关闭时或者定时一段时间才自动保存到TXT文件。 pursuits 发表于 2019-4-17 14:14
可以先写一个串口通讯的类,把接收到的数据实时传出来。
public class SerialManage
{
老铁,我看你把好象把串口操作封到类里面去了。。
万一,用户要在外面操作串口各种功能,保存在文本里只是附带的功能,岂不是脸一黑。。
kinsno 发表于 2019-4-19 13:50
老铁,我看你把好象把串口操作封到类里面去了。。
万一,用户要在外面操作串口各种功能,保存在文本里只 ...
可能是我没写清楚。
后面的使用方法是在主类里面,串口类里面只有串口的简单操作。 pursuits 发表于 2019-4-19 16:31
可能是我没写清楚。
后面的使用方法是在主类里面,串口类里面只有串口的简单操作。 ...
请教一下,UI界面即主界面 form1.cs 内部有一个textbox,我另外写了一个类,并单独成一个文件 ymode.cs , 如何在这个ymode.cs内可以去把日志信息写在form1.cs的textbox,这就相当于在另外一个类文件内,跨线程调用控件。。这种你有经验吗,方便指怕一下吗?
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 pursuits 发表于 2019-4-20 10:01
在外面不方便贴代码。你可以看下这个代码。
http://www.huiyaosoft.com/winformlist.htm
谢谢,代码太大了,我通过别的方法解决了。。。
页:
[1]