1.串口通讯
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO.Ports;//串口的命名空间
using Cognex.VisionPro;
using System.IO;
using Cognex.VisionPro.ToolBlock;
using Cognex.VisionPro.Caliper;
using Cognex.VisionPro.PMAlign;
namespace _07串口通讯
{
class Vision
{
CogRecordDisplay cogRecord;//传过来的显示控件
//声明图像采集工具
CogAcqFifoTool fifoTool;
//声明TooBlock工具
CogToolBlock cogToolBlock;
//串口通信
SerialPort serialData;
//是否有串口通讯(若有则可以开启实时)
bool flag = false;
//卡尺类型
CogCaliperTool cogCaliper;//卡一
CogCaliperTool cogCaliper1;//卡二
//处理实时和显示效果图的冲突
bool flag1 = false;
//
ICogImage cogImage;
//textBox控件
TextBox textBox1C;
//构造函数
public Vision(CogRecordDisplay cogRecordDisplay,TextBox textBox1)
{
cogRecord = cogRecordDisplay;
textBox1C = textBox1;
}
//加载VPP程序
public bool LoadVpp()
{
try
{
fifoTool = CogSerializer.LoadObjectFromFile(Directory.GetCurrentDirectory() + "\\VPP\\CogAcqTool1.vpp") as CogAcqFifoTool;
cogToolBlock = CogSerializer.LoadObjectFromFile(Directory.GetCurrentDirectory() + "\\VPP\\TB.vpp") as CogToolBlock;
//声明串口对象
serialData = new SerialPort();
serialData.PortName = "COM2";
//波特率
serialData.BaudRate = 9600;
//校验位
serialData.Parity = Parity.None;
//数据位
serialData.DataBits = 8;
//停止位
serialData.StopBits = StopBits.One;
//串口接受数据的事件
serialData.DataReceived += SerialData_DataReceived;//指示已通过由 System.IO.Ports.SerialPort 对象表示的端口接收了数据。
if (!serialData.IsOpen)
serialData.Open();
return true;
}
catch (Exception)
{
return false;
}
}
private void SerialData_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//获取缓存区的数据字节大小
int size = serialData.BytesToRead;
//动态创建字节数组
byte[] buffer = new byte[size];
//读取缓存区的数据到buffer数组
serialData.Read(buffer, 0, buffer.Length);
//把字节转换成字符串
string msg = Encoding.ASCII.GetString(buffer);
cogCaliper = cogToolBlock.Tools["CogCaliperTool1"] as CogCaliperTool;
cogCaliper1 = cogToolBlock.Tools["CogCaliperTool2"] as CogCaliperTool;
//判断接收T1信号 相机拍照
if (msg.Contains("T1"))
{
fifoTool.Run();
cogToolBlock.Inputs["OutputImage"].Value = fifoTool.OutputImage;
cogToolBlock.Run();
cogImage = cogToolBlock.Inputs["OutputImage"].Value as ICogImage;
cogRecord.Image = null;
cogRecord.Image = cogImage;
//MessageBox.Show(f.ToString());
DisplayPicture();
//拍一张卡尺测一次宽传入
serialData.WriteLine(cogCaliper.Results[0].Width.ToString("f2"));
}
}
//关闭窗口时同时关闭相机和通讯串口
public void FromCoing()
{
//关闭相机
CogFrameGrabbers cogFrame = new CogFrameGrabbers();
foreach (ICogFrameGrabber item in cogFrame)
{
item.Disconnect(false);
}
//关闭串口(if判断不为空时进入)
if (serialData != null && serialData.IsOpen)
serialData.Close();
}
public void DisplayPicture()
{
if (cogToolBlock.RunStatus.Result == CogToolResultConstants.Accept)
{
cogRecord.Record = cogToolBlock.CreateLastRunRecord().SubRecords["CogPMAlignTool1.InputImage"];
cogRecord.Fit();
}
}
/// <summary>
/// 拍照
/// </summary>
public void PhotoGraph()
{
if (fifoTool!=null&&fifoTool.Operator!=null)
{
//开始拍照
}
}
//实时显示
public void LivePreview()
{
cogRecord.StartLiveDisplay(fifoTool.Operator, false);
}
//停止实时
public void LiveStoePreview()
{
cogRecord.StopLiveDisplay();
}
}
}