using System; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO.Ports; namespace portDemo { public partial class Form1 : Form { public SerialPort Com; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Com = new SerialPort(); cmbBaudRate.SelectedIndex = 6; cmbDataBits.SelectedIndex = 3; cmbStopBits.SelectedIndex = 1; cmbParity.SelectedIndex = 0; } /// <summary> /// 检索串口 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSearchCom_Click(object sender, EventArgs e) { string[] PortNames = SerialPort.GetPortNames(); if (PortNames.Length != 0) { for (int i = 0; i < PortNames.Length; i++) { cmbPortName.Items.Add(PortNames[i]); } cmbPortName.SelectedIndex = 0; } else MessageBox.Show("No Ports!"); } /// <summary> /// 打开串口 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnOpenCom_Click(object sender, EventArgs e) { try { Com.PortName = cmbPortName.Text; Com.BaudRate = int.Parse(cmbBaudRate.Text); Com.DataBits = int.Parse(cmbDataBits.Text); switch (cmbStopBits.Text) { case "None": Com.StopBits = StopBits.None; break; case "One": Com.StopBits = StopBits.One; break; case "Two": Com.StopBits = StopBits.Two; break; case "OnePointFive": Com.StopBits = StopBits.OnePointFive; break; } switch (cmbParity.Text) { case "None": Com.Parity = Parity.None; break; case "Even": Com.Parity = Parity.Even; break; case "Odd": Com.Parity = Parity.Odd; break; case "Space": Com.Parity = Parity.None; break; case "Mark": Com.Parity = Parity.None; break; } Com.Open(); new Task(() => { while (true) { RecieveData(); } }).Start(); } catch (Exception ex) { MessageBox.Show("打开串口失败!"); } } /// <summary> /// 发送数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSend_Click(object sender, EventArgs e) { if (Com.IsOpen) { Com.Write(textBox2.Text); } textBox1.AppendText(Com.PortName + "发送:" + textBox2.Text + "\r\n"); } /// <summary> /// 接收数据 /// </summary> private void RecieveData() { // 查询串口中目前保存了多少数据 int n = Com.BytesToRead; // 读取数据 byte[] buf = new byte[n]; Com.Read(buf, 0, n); Com.Encoding = Encoding.GetEncoding("GB2312"); // 打印数据 if (buf.Length > 0) { string str = Encoding.Default.GetString(buf); if (this.textBox1.InvokeRequired) { this.Invoke(new Action(delegate{ textBox1.AppendText(Com.PortName + "接收:" + str + "\r\n"); })); } else { textBox1.AppendText(Com.PortName + "接收:" + str + "\r\n"); } } } } }
工业相机的数字接口主要包括以下几类:Camera Link接口、IEEE 1394接口、USB接口、网络接口、CoaXPress接口。Camera Link接口是专门针对工业相机(camera)的特殊应用需求(图像的数据量大、带宽要求高)而研发出来的,传输速度快,这也正是Camera Link接口最主要的优点之一。根据相机实际带宽需求的不同,Camera Link采集卡从传输速度上也可以分为以下四类(带宽依次增加,且向下兼容):Base(2.0Gbit/S 即255MB/s)、Medium(4.8Gbit/S即610MB/S)、Full(5.4Gbit/S @ 85MHZ即680MB/s)、Deca(6.8Gbit/S即850MB/S),从外观上看不出它们的区别,因为提升速度主要是通过增加内部集成的芯片模块来实现的。主要的差别是: 只具有Base功能的采集卡一般只有一个Camera Link接口,而其他的至少包含两个。
使用Camera Link接口的工业相机还具有一个特点,那就是相机生产商一般不提供该相机的使用接口(例如相机自带的图像采集软件,以及相应的SDK等),这是因为:Camera Link接口的工业相机和其他接口相机不同,它的图像采集、处理等软件算法工作主要在Camera Link采集卡上来完成,相机厂商主要只负责硬件这一部分的工作。换句话说,对于Camera Link接口的工业相机来说,这个相机在物理上是被硬生生拆成了两部分,其中一部分以采集卡的形式被安装在主机电脑上了。这样的好处是:如果你对某款Camera Link采集卡的编程比较熟悉,那么世界上任何使用该接口的相机你都可以很快上手。
2.2 曝光参数
网口相机的曝光参数如之前的海康相机一般,利用pMyCamera.MV_CC_SetEnumValue_NET即可。线扫相机一般需要通过自己的软件设置曝光,以e2v相机为例,e2v相机通过comcam软件设置曝光,打开comcam软件,连接Com口,选择One external trigger with exteral exposure time工作模式,让曝光受外部控制。然后依据说明书上的指令,用串口程序连接Com口,发送指令,“t exp 600”可将曝光设置为60.