|
发表于 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);//开始写入值
}
}
|
|