110,571
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;
using System.IO.Ports;
using System.Threading;
using CommonClass;
namespace JSNForm
{
public partial class QD : Form
{
public QD()
{
InitializeComponent();
Init();
}
BLLJSN.BLLDic blldic = new BLLJSN.BLLDic();
DataSet DsMain = new DataSet();
Queue objQ = new Queue();
string bianhao = null;
string fangxiang = null;
string shijian = null;
string str1 = null;
/// <summary>
/// 串口初始化
/// </summary>
private void Init()
{
serialPort.PortName = "COM1";
serialPort.BaudRate = 38400;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
serialPort.Parity = Parity.Even;
}
private void QD_Load(object sender, EventArgs e)
{
OpenSerialPort();
SerialPortSend("05 00 44 AE 04 ");//清除设备的缓存数据命令
}
private void QD_FormClosed(object sender, FormClosedEventArgs e)
{
Application.Exit();
}
private void tsb_ks_Click(object sender, EventArgs e)
{
if (serialPort.IsOpen)
{
timer1.Start();
}
else { MessageBox.Show("串口未打开!"); }
}
private void timer1_Tick(object sender, EventArgs e)
{
SerialPortSend("05 00 43 11 70 ");//获取串口数据的命令
timer1.Interval = 500;
}
private void tsb_dk_Click(object sender, EventArgs e)
{
timer1.Stop();
if (tsb_dk.Text == "打开串口")
{
OpenSerialPort();
}
else
{
CloseSerialPort();
}
}
/// <summary>
/// 打开串口
/// </summary>
private void OpenSerialPort()
{
if (serialPort.IsOpen)
{
return;
}
try
{
serialPort.DataReceived -= serialPort_DataReceived;
serialPort.DataReceived += serialPort_DataReceived;
serialPort.Encoding = Encoding.Default;
serialPort.Open();
if (serialPort.IsOpen)
{
tsb_dk.Text = "关闭串口";
}
else
{
tsb_dk.Text = "打开串口";
}
}
catch
{
MessageBox.Show("关闭串口失败!");
}
}
/// <summary>
/// 关闭串口
/// </summary>
private void CloseSerialPort()
{
if (!serialPort.IsOpen)
{
return;
}
try
{
serialPort.DataReceived -= serialPort_DataReceived;
while (SerialPortIsReceiving)
{
Application.DoEvents();
}
serialPort.Close();
if (serialPort.IsOpen)
{
tsb_dk.Text = "关闭串口";
}
else
{
tsb_dk.Text = "打开串口";
}
}
catch
{
MessageBox.Show("关闭串口失败!");
}
}
/// <summary>
/// 向通到发送指令
/// </summary>
/// <param name="ss"></param>
public void SerialPortSend(string ss)
{
if (!serialPort.IsOpen)
{
MessageBox.Show("串口未打开,无法发送数据!");
}
try
{
string sCmd = ss;
byte[] byte_arr = new byte[sCmd.Length / 3];
for (int i = 0; i < sCmd.Length; i += 3)
{
try
{
byte_arr[i / 3] = Convert.ToByte(sCmd.Substring(i, 2), 16);
}
catch (SystemException ex)
{
MessageBox.Show(ex.Message);
}
}
serialPort.Write(byte_arr, 0, byte_arr.Length);
}
catch (SystemException ex)
{
MessageBox.Show(ex.Message);
}
}
/// <summary>
/// 通道返回数据
/// </summary>
bool SerialPortIsReceiving = false;
public void serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPortIsReceiving = true;
try
{
byte[] b = new byte[serialPort.BytesToRead];
serialPort.Read(b, 0, b.Length);
string str = "";
for (int i = 0; i < b.Length; i++)
{
str += string.Format("{0:X2} ", b[i]);
}
AppendTextBox(str);
str = null;
}
catch (SystemException ex)
{
MessageBox.Show(ex.Message);
}
SerialPortIsReceiving = false;
}
delegate void SetTextCallback(string text);
private void AppendTextBox(string text)
{
try
{
if (Receive_TextBox.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(AppendTextBox);
this.Invoke(d, text);
}
else
{
Receive_TextBox.SuspendLayout();
if (text.Length == 1 && text[0] == (char)0x08)
{
if (Receive_TextBox.Text.Length > 0)
{
Receive_TextBox.SelectionStart = Receive_TextBox.Text.Length - 1;
Receive_TextBox.SelectionLength = 1;
Receive_TextBox.SelectedText = "";
}
}
else
{
Receive_TextBox.AppendText(text);
}
if (Receive_TextBox.Text.Length > 100000)
{
Receive_TextBox.Text = Receive_TextBox.Text.Substring(50000, Receive_TextBox.Text.Length - 50000);
}
Receive_TextBox.ResumeLayout(false);
}
}
catch (SystemException ex)
{
MessageBox.Show(ex.Message);
}
}
new Action<要传递的数据类型>(DoIt).BeginInvoke(mydata,null,null);
new Action<要传递的数据类型>(DoIt)(mydata,null,null);
new Action(() => { DoIt(myData);}).BeginInvoke(null, null);
这个写法看起来比较头晕,可以用老式的写法我在重写一下。首先你需要额外定义一个Delegate类型:public delegate MyProc(要传递的数据类型 data);
然后将你的DoIt那一行代码修改为:MyProc p=DoIt;
p(mydata,null,null);
ThreadPool.QueueUserWorkItem(h => { DoIt(myData); });
.......
DoIt(myData);
.......
new Action(() => { DoIt(myData);}).BeginInvoke(null, null);
public class DataCache
{
internal static Queue<Record> ColRecord = new Queue<Record>(); // 装载记录信息
}
/// <summary>
/// 提取记录线程类
/// </summary>
public class ColRecordThread
{
private bool bThreadSign; // 线程标志, 为True时运行线程, 否则结束线程
public bool BThreadSign
{
get { return bThreadSign; }
set { bThreadSign = value; }
}
public static void ThreadingControl(bool bRun)
{
if (bRun)
{
// 创建并启动线程
}
else
{
// 结束线程
return;
}
}
public void JanitorRecord()
{
while (true == this.BThreadSign)
{
Record record = GetRecord(); // 得到记录
DataCache.ColRecord.Enqueue(record); // 记录入队
Thread.Sleep(200);
if (!this.BThreadSign) return;
}
}
}
/// <summary>
/// 显示记录线程
/// </summary>
public class ResponseThread
{
public static Action<int, Record> MessageReceive; // 信息接收事件
private bool bThreadSign; // 线程标志, 为True时运行线程, 否则结束线程
public bool BThreadSign
{
get { return bThreadSign; }
set { bThreadSign = value; }
}
public static void ThreadingControl(bool bRun)
{
if (bRun)
{
// 创建并启动线程
}
else
{
// 结束线程
return;
}
}
public void JanitorRecord()
{
while (true == this.BThreadSign)
{
if (DataCache.ColRecord.Count == 0) // 如果队列中没有数据, 则等待三秒钟后继续
{
Thread.Sleep(3000);
continue;
}
if (MessageReceive != null)
{
MessageReceive(0, DataCache.ColRecord.Dequeue()); // 记录出队, 回传MessageSend事件
}
Thread.Sleep(200);
if (!this.BThreadSign) return;
}
}
}