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