namespace scommReceiver.ClsTemplate
{
public delegate void SetStringOnMainEventHandler(String msg);
class ShareData
{
private static Queue shareQuene= new Queue();
public event SetStringOnMainEventHandler SetStringOnboard;
public void DealData()
{
while (true)
{
if (shareQuene.Count > 0)
{
byte[] data = (byte[])shareQuene.Dequeue();
String rt = System.Text.Encoding.Default.GetString(data);
SetStringOnboard(rt);
rt = null;
}
Thread.Sleep(10);
}
}
public static void setShareQuene(byte[] data)
{
Monitor.Enter(shareQuene);
shareQuene.Enqueue(data);
Monitor.Exit(shareQuene);
}
}
}namespace scommReceiver
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
ShareData sd = new ShareData();
public delegate void setMsg(string msg);
private void Form1_Load(object sender, EventArgs e)
{
Microsoft.VisualBasic.Devices.Computer pc = new Microsoft.VisualBasic.Devices.Computer();
foreach( string s in pc.Ports.SerialPortNames ){
this.cbCom.Items.Add(s);
this.cbCom.SelectedIndex = 0;
this.cbBaud.SelectedIndex = 0;
this.btnStart.Tag = "0"; Thread dataThread = new Thread(new ThreadStart(sd.DealData));
dataThread.IsBackground = true;
dataThread.Start(); serialPort.DataReceived += new SerialDataReceivedEventHandler(SPort_ReceivedData);
sd.SetStringOnboard += ShowMsg;
}
}
private void SPort_ReceivedData(object sender, SerialDataReceivedEventArgs args)
{
int len = serialPort.BytesToRead;
byte[] ReDatas = new byte[len];
serialPort.Read(ReDatas, 0, ReDatas.Length);
ShareData.setShareQuene(ReDatas);
}
private void initSPort()
{
if ("0".Equals(btnStart.Tag.ToString()))
{
serialPort.PortName = this.cbCom.Text.Trim().ToString();
serialPort.BaudRate = Int32.Parse(this.cbBaud.Text);
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
if (!serialPort.IsOpen)
{
try
{
serialPort.Open();
}
catch (Exception e)
{
MessageBox.Show(e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
btnStart.Tag = "1";
btnStart.Text = "关闭";
cbCom.Enabled = false;
cbBaud.Enabled = false;
}
}
else
{
if (serialPort.IsOpen)
{
try
{
serialPort.Close();
}
catch (Exception e)
{
MessageBox.Show(e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
serialPort.Close();
}
btnStart.Text = "开始";
btnStart.Tag = "0";
cbCom.Enabled = true;
cbBaud.Enabled = true;
}
}
}
private void btnStart_Click(object sender, EventArgs e)
{
initSPort();
}
private void ShowMsg(String msg)
{
Console.WriteLine("msg="+msg);
this.Invoke(new setMsg(show), new object[] { msg });
}
private void show(string pmsg)
{
this.txtMsg.AppendText(pmsg);
} private void btnClear_Click(object sender, EventArgs e)
{
this.txtMsg.Clear();
}
}
}C#多线程串口通信线程紊乱
{
public delegate void SetStringOnMainEventHandler(String msg);
class ShareData
{
private static Queue shareQuene= new Queue();
public event SetStringOnMainEventHandler SetStringOnboard;
public void DealData()
{
while (true)
{
if (shareQuene.Count > 0)
{
byte[] data = (byte[])shareQuene.Dequeue();
String rt = System.Text.Encoding.Default.GetString(data);
SetStringOnboard(rt);
rt = null;
}
Thread.Sleep(10);
}
}
public static void setShareQuene(byte[] data)
{
Monitor.Enter(shareQuene);
shareQuene.Enqueue(data);
Monitor.Exit(shareQuene);
}
}
}namespace scommReceiver
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
ShareData sd = new ShareData();
public delegate void setMsg(string msg);
private void Form1_Load(object sender, EventArgs e)
{
Microsoft.VisualBasic.Devices.Computer pc = new Microsoft.VisualBasic.Devices.Computer();
foreach( string s in pc.Ports.SerialPortNames ){
this.cbCom.Items.Add(s);
this.cbCom.SelectedIndex = 0;
this.cbBaud.SelectedIndex = 0;
this.btnStart.Tag = "0"; Thread dataThread = new Thread(new ThreadStart(sd.DealData));
dataThread.IsBackground = true;
dataThread.Start(); serialPort.DataReceived += new SerialDataReceivedEventHandler(SPort_ReceivedData);
sd.SetStringOnboard += ShowMsg;
}
}
private void SPort_ReceivedData(object sender, SerialDataReceivedEventArgs args)
{
int len = serialPort.BytesToRead;
byte[] ReDatas = new byte[len];
serialPort.Read(ReDatas, 0, ReDatas.Length);
ShareData.setShareQuene(ReDatas);
}
private void initSPort()
{
if ("0".Equals(btnStart.Tag.ToString()))
{
serialPort.PortName = this.cbCom.Text.Trim().ToString();
serialPort.BaudRate = Int32.Parse(this.cbBaud.Text);
serialPort.Parity = Parity.None;
serialPort.DataBits = 8;
serialPort.StopBits = StopBits.One;
if (!serialPort.IsOpen)
{
try
{
serialPort.Open();
}
catch (Exception e)
{
MessageBox.Show(e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
btnStart.Tag = "1";
btnStart.Text = "关闭";
cbCom.Enabled = false;
cbBaud.Enabled = false;
}
}
else
{
if (serialPort.IsOpen)
{
try
{
serialPort.Close();
}
catch (Exception e)
{
MessageBox.Show(e.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
serialPort.Close();
}
btnStart.Text = "开始";
btnStart.Tag = "0";
cbCom.Enabled = true;
cbBaud.Enabled = true;
}
}
}
private void btnStart_Click(object sender, EventArgs e)
{
initSPort();
}
private void ShowMsg(String msg)
{
Console.WriteLine("msg="+msg);
this.Invoke(new setMsg(show), new object[] { msg });
}
private void show(string pmsg)
{
this.txtMsg.AppendText(pmsg);
} private void btnClear_Click(object sender, EventArgs e)
{
this.txtMsg.Clear();
}
}
}C#多线程串口通信线程紊乱
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货