视觉_光源控制_RS232

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using System.Windows.Forms;

namespace ceshi
{
public partial class Form1 : Form
{

    byte[] senBuffer = new byte[8];
    byte[] rcvBuffer = new byte[8];

    int sleepTime = 50;

    // 定时器,控制 左相机 定时拍照
    public System.Timers.Timer timer_run_camera;

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Control.CheckForIllegalCrossThreadCalls = false;

        button1.BeginInvoke(new Action(() => { button1.TabStop = true; }));

        if (!serialPort1.IsOpen)
        {
            serialPort1.PortName = "COM10";
            serialPort1.Open();
        }

        // 使用线程池
        ThreadPool.QueueUserWorkItem(state => open_timer_camera());
        
    }

    public void open_timer_camera()
    {
        timer_run_camera = new System.Timers.Timer(); //创建timer定时器
        timer_run_camera.Elapsed += new ElapsedEventHandler(open_camera);  //到达时间的时候执行事件;
        // 设置引发时间的时间间隔 此处设置为3分钟,
        timer_run_camera.Interval = 180000; //180000
        timer_run_camera.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
        timer_run_camera.Enabled = true; //是否执行System.Timers.Timer.Elapsed事件;
    }

    public void open_camera(object sender, EventArgs e)
    {
        operation_light_source(1, 2);
        operation_light_source(1, 1);

        Thread.Sleep(4000);
        // 关灯
        operation_light_source(2, 1);
        operation_light_source(2, 2);
    }

    /** 
    控制开关两个光源
    of_on 为1 开光源,为2 关光源
    pass 为1  表示1 号光源,为2 表示2号光源
        */
    public void operation_light_source(byte of_on, byte pass)
    {
        serialsend(of_on, pass, 255);
        Array.Clear(senBuffer, 0, senBuffer.Length);     //清空发送缓存区
        Array.Clear(rcvBuffer, 0, rcvBuffer.Length);     //清空接收缓存区
    }



    /**  
    手动控制 界面
    光源控制
    串口 给两个光源发送数据,用通道区分两个光源,
    一个串口控制两个光源
        为啥里面延时



        RS232通讯

  
        DCM2.0-2C015W-24PS
        输入电压
        24V
        功率
        15W
        */
    //送命令command  port 通道  value数据值 
    private void serialsend(byte command, byte port, int value)
    {
        byte[] b_value = new byte[3];              //亮度值用3位字节表示

        byte[] b_check = new byte[2];              //校验位用2位字表示

        string str1 = value.ToString("X3");        //亮度值处理,将value转化为3位的16进制字符
        b_value[0] = Convert.ToByte(str1[0]);      //将数据转化为Ascall码十进制数
        b_value[1] = Convert.ToByte(str1[1]);      //将数据转化为Ascall码十进制数
        b_value[2] = Convert.ToByte(str1[2]);      //将数据转化为Ascall码十进制数
        //MessageBox.Show(b_value[0].ToString() + " " + b_value[1].ToString() + " " + b_value[2].ToString());
        senBuffer[0] = 0x24;                                //特征字$
        //等价于senBuffer[0] =36; 
        senBuffer[1] = Convert.ToByte(command + 48);                      //命令1表示打开,2表示关闭,3表示设置,4表示读取,command+48表示将数据转化为Ascall码十进制数
        senBuffer[2] = Convert.ToByte(port + 48);                         //通道,port+48表示将数据转化为Ascall码十进制数
        senBuffer[3] = b_value[0];                         //数据高位
        senBuffer[4] = b_value[1];                         //数据中位
        senBuffer[5] = b_value[2];                         //数据低位
        Check_Dell();              //调用验证位处理函数,处理senBuffer[]最后2个验证位
        //MessageBox.Show(senBuffer[1].ToString());

        if (serialPort1.IsOpen)
        {
            serialPort1.Write(senBuffer, 0, 8);          //发送指令
            Thread.Sleep(sleepTime);                     //等待控制器响应
                                                         // ShowMesage();                              //通讯显示函数
        }
        else
        {
            // System.Windows.MessageBox.Show("串口没有打开");
        }
    }


    //验证位处理函数,处理senBuffer的数据,senBuffer后2位元素(即验证位)暂时为空
    void Check_Dell()
    {
        byte[] buffer = senBuffer;

        buffer[buffer.Length - 2] = 0;                      //任何数据与0异或都等于其本身,故先对第一个(高位)验证位赋0
        for (int i = 0; i < buffer.Length - 2; i++)
        {
            buffer[buffer.Length - 2] = Convert.ToByte(buffer[buffer.Length - 2] ^ buffer[i]);           //验证位分别与前面的每个数据累计作异或运算
        }

        buffer[buffer.Length - 1] = buffer[buffer.Length - 2];   //令buffer后2位元素(即验证位)相等
        buffer[buffer.Length - 2] >>= 4;                          //高位右移4位,得到高位验证位
        buffer[buffer.Length - 1] &= 15;                         //15二进制即0000 1111,按位与可获得低位验证位

        buffer[buffer.Length - 2] = Convert.ToByte(buffer[buffer.Length - 2].ToString("X1")[0]);   //强制转化16为进制字符,再转化为Ascall码
        buffer[buffer.Length - 1] = Convert.ToByte(buffer[buffer.Length - 1].ToString("X1")[0]);

        //senBuffer[senBuffer.Length - 2] =buffer[buffer.Length - 2];                 //处理完成,对原数据赋值
        //senBuffer[senBuffer.Length - 1] =buffer[buffer.Length - 1];
        senBuffer = buffer;
    }


    string DecodeData(byte[] Buffer)                                       //解码函数,返回处理后的字符串
    {
        string str = Encoding.ASCII.GetString(Buffer);
        return str;
    }


    void ShowMesage()     //通讯显示函数,show在textbox
    {
        string sBuffer = "发送:";
        string rBuffer = "接收:";
        string str = "";
        string ch = "\r\n";
        sBuffer += DecodeData(senBuffer);
        rBuffer += DecodeData(rcvBuffer);
        if (rBuffer[0] == 0x26) { rBuffer += "指令执行失败!"; }
        if (rBuffer == null || rBuffer == "") { rBuffer += "未接收到控制器响应"; }
        str = sBuffer + "     " + rBuffer;
      //  textBox1.AppendText(str);
       // textBox1.AppendText(ch);
    }



}

}

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值