C#笔记 线扫相机利用串口通信设置曝光

1. 串口通信

串行接口是一种可以将接收来自CPU并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。串口通信(Serial Communications)即串口按位(bit)发送和接收字节通信方式

 

 

 

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");
                }
            }           
        
        }
        
    }
}

 

2. 线扫相机

2.1 Camera Link接口

  工业相机的数字接口主要包括以下几类: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.

posted @ 2022-01-16 14:53  湾仔码农  阅读(717)  评论(0编辑  收藏  举报