今天做项目,做连接硬件的部分。
我要连接三个硬件。
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 ESRI.ArcGIS.Carto;
using System.IO.Ports;//取电脑中串口
using System.Collections;//数组
using System.Threading;
using System.Diagnostics;
namespace Hydor1
{
public partial class Sounder : Form
{
string project = String.Empty;
Boolean isConn = false;
private SerialPort port1;
public Sounder(string pro, Boolean conn, SerialPort port)
{
InitializeComponent();
project = pro.Substring(6);//取前六位
isConn = conn;
this.port1 = port;
}
#region 窗口加载
private void Depthfinder_Load(object sender, EventArgs e)
{
if (isConn)
{
Dep_test.Enabled = false;
}
else
{
Dep_test.Enabled = true;
}
//从电脑中查找可用串口
/* string[] portlist = SerialPort.GetPortNames();//获取当前计算机的串行端口名称数组
ArrayList comList = new ArrayList();
for (int i = 0; i < portlist.Length; i++)
{
comList.Add(new DictionaryEntry(portlist[i].Substring(3), portlist[i]));
}
this.Dep_portName.DataSource = comList;
this.Dep_portName.DisplayMember = "Value";
this.Dep_portName.ValueMember = "Key";
*/
//读取项目数据
try
{
string sql = "select * from Sounder where 项目名称='" + project + "'";
DataBaseConnection connection = new DataBaseConnection();
DataSet myds = connection.getDataSet(sql);
Dep_portName.Text = myds.Tables[0].Rows[0]["测深仪串口"].ToString();
Dep_parity.Text = myds.Tables[0].Rows[0]["测深仪奇偶校验"].ToString();
Dep_baudRate.Text = myds.Tables[0].Rows[0]["测深仪波特率"].ToString();
Dep_stopBits.Text = myds.Tables[0].Rows[0]["测深仪停止位"].ToString();
Dep_dataBits.Text = myds.Tables[0].Rows[0]["测深仪数据位"].ToString();
Dep_protocol.Text = myds.Tables[0].Rows[0]["测深仪握手协议"].ToString();
}
catch (Exception ex)
{
MessageBox.Show("查询数据错误!" + ex.Message);
}
}
#endregion
#region 保存
private void Dep_confirm_Click_1(object sender, EventArgs e)
{
try
{
string sql = "update Sounder set 测深仪串口='" + Dep_portName.Text + "',测深仪奇偶校验='" + Dep_parity.Text + "',测深仪波特率='" + Dep_baudRate.Text +
"',测深仪停止位='" + Dep_stopBits.Text + "',测深仪数据位='" + Dep_dataBits.Text + "',测深仪握手协议='" + Dep_protocol.Text +
"' where 项目名称='" + project + "'";
DataBaseConnection connection = new DataBaseConnection();
connection.insertOrUpdate(sql);
// this.Close();
this.Hide();
}
catch (Exception ex)
{
MessageBox.Show("数据保存错误!" + ex.Message);
}
}
#endregion
#region 测试
private void Dep_test_Click_1(object sender, EventArgs e)
{
try
{
string portname = Dep_portName.Text.ToString();
this.port1.PortName = portname;
//SerialPort port1 = new SerialPort(portname);//取Dep_portName的数据,对你的port1 注册一个事件委托
port1.BaudRate = Convert.ToInt32(Dep_baudRate.Text);
if (Dep_parity.Equals("无"))
{
port1.Parity = Parity.None;
}
else if (Dep_parity.Equals("奇"))
{
port1.Parity = Parity.Odd;
} if (Dep_parity.Equals("偶"))
{
port1.Parity = Parity.Even;
}
if(Dep_stopBits.Equals("1"))
{
port1.StopBits = StopBits.One;
}
else if (Dep_stopBits.Equals("1.5"))
{
port1.StopBits = StopBits.OnePointFive;
}
else if (Dep_stopBits.Equals("2"))
{
port1.StopBits = StopBits.Two;
}
port1.DataBits = Convert.ToInt32(Dep_dataBits.Text);
port1.Handshake = Handshake.None;//握手协议有问题未解决---haokl
port1.RtsEnable = true;//是否请求发送RTS信号,,,有问题未解决---haokl
port1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);//绑定事件
port1.Open();
// Thread.CurrentThread.IsBackground = true;//将线程设为后台
//port1.ReadLine();// 向串口接受数据---wenti
port1.WriteLine("111");//向串口发送数据
MessageBox.Show("接收测深仪数据成功!");
//port1.Close();
}
catch (Exception)
{
MessageBox.Show("连接测深仪失败!");
}
}
#endregion
#region 接收数据
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();// 向串口接受数据
Console.WriteLine("Data Received:");//输出获取的数据
Console.Write(indata);
}
#endregion
#region 取消
private void Dep_cancel_Click_1(object sender, EventArgs e)
{
this.Close();
}
#endregion
}
}
但是当一个硬件测试连接成功之后,点保存关闭时,会报 ObjectDisposedException错误。
经过查找总结原因,发现是因为点保存按钮时线程也关闭了,但数据没发送完或者是接收完。
我连接的仪器不想关闭,想一直接收数据,就要实现,form关闭,但线程还在继续。。。
解决办法:
在form的父窗体声明一个串口,给子窗体,子窗体关闭时,只关闭子窗体的线程,但父窗体的线程还在继续。
父窗体的代码如下:
public SerialPort port1 = new SerialPort();//串口
#region 设置测深仪
private void 测深仪选项ToolStripMenuItem_Click(object sender, EventArgs e)
{
port1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);//绑定事件
string project = CurrentProjectLab.Text;
Sounder depth = new Sounder(project, isConn, port1);
depth.Owner = this;
depth.ShowDialog();
}
#endregion
#region 获取测深仪串口获得的数据
private static void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadExisting();// 向串口接受数据
Console.WriteLine("Data Received:");//输出获取的数据
Console.Write(indata);
}
这样就可以啦,,,啊哈哈哈哈哈哈。。。。。。。。。
当然。。这不是我自己解决的。这是大神给我解决的。。。
继续向大神学习!