zoukankan      html  css  js  c++  java
  • C# 串口开发 SerialPort

    首先申明下:这个名字对不对我也不太清楚,我是第一次一个人在开发,之前是基于webfrom开发。

    哎!无奈为了生活搞起了winfrom,上几个月一家公司,名字我就不说了 也是winform 他对我很好!也很用心的教我,使我对oracle的数据库脚本编程进一步熟悉了,        xxx  wcf。可是当时我不喜欢winfrom的原因,后来辞职了。现在想想 还是一样又搞 了winfrom ,生活让你变的成熟,理性。感谢你!大勇!

    代码:

    View Code
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Collections;
    using System.IO.Ports;
    using System.Threading;
    using System.Diagnostics;
    using System.Text.RegularExpressions;
    using System.Runtime.InteropServices;
    using System.Reflection; 
    
    namespace WC_Task
    {
        public partial class Form1 : Form
        {
            #region 自定义变量
            SerialPort spt = new SerialPort();
            public string strCOMPort = "COM4";//串口
            public int intCOMBaud = 9600;//波特率
            string orgStr = "";
            string[] getLastNum;//发送数据集合
            bool FileExists_timer;//文件存在后是否执行定时器
            bool FileExists;//文件是否存在
            Thread StarThread;
            //string filename = @"\ResidentFlash\mainmenuOne.exe";
            string filename = @"\ResidentFlash\yjt\yjt.exe";//外部程序目标
            string fileNamePath = @"\SDMMC\DriverInfo.dat";
    
            #region   任务栏隐藏
            [DllImport("coredll.dll")]
            public static extern int ShowWindow(int hwnd, int nCmdShow);
            [DllImport("coredll.dll")]
            private static extern int FindWindow(string lpClassName, string lpWindowName);
            #endregion
            #endregion
    
            #region 自定义方法
    
            /// <summary>
            ///  打开串口
            /// </summary>
            private void OpenSpt()
            {
                if (spt.IsOpen)
                {
                    spt.Close();
                }
                else
                {
                    spt.PortName = strCOMPort;
                    spt.BaudRate = intCOMBaud;
                    spt.NewLine = "\r\n";
                    spt.Open();
                }
            }
    
            /// <summary>
            /// 读取文件
            /// </summary>
            /// <param name="filePath">文件路劲</param>
            public bool FileRead(string filePath)
            {
                FileInfo fio = new FileInfo(filePath);
                byte[] data = new byte[3];
    
                if (!fio.Exists)
                {
                    return false;
                }
                else
                {
                    using (StreamReader sr = new StreamReader(filePath, System.Text.Encoding.Default))
                    {
                        string info = sr.ReadLine();
                        if (!string.IsNullOrEmpty(info))
                        {
                            data = Convert.FromBase64String(info);
                            orgStr = Encoding.Default.GetString(data, 0, data.Length);
    
                            if (data.Length > 0)
                            {
                                getLastNum = orgStr.Split(',');//字符分割
                                LblName_info.Text = getLastNum[0];
                                LalAge_info.Text = getLastNum[1];
                                LblSex_info.Text = getLastNum[2];
                                LblNumber_info.Text = getLastNum[3];
                            }
                            return true;
                        }
                        else
                        {
                            return false;
                        }
                    }
                }
            }
    
            /// <summary>
            /// 发送数据"0F, A5, 31, 34, 23, 23, 23, 23, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, AD, F0";
            /// </summary>
            public void SendSpt(string getLastNum)
            {
                byte[] Number_sp = System.Text.Encoding.ASCII.GetBytes(getLastNum);
                byte[] Number = new byte[26];
    
                Number[0] = 0x0F;
                Number[1] = 0xA5;
                Number[2] = 0x31;
                Number[3] = 0x34;
    
                for (int i = 4; i < getLastNum.Length; i++)
                {
                    Number[i] = Number_sp[i];
                }
    
                for (int i = 1; i <=23; i++)
                {
                    Number[24] = (byte)((byte)Number[24] ^ (byte)Number[i]);
                }
    
                Number[25] = 0xF0;
    
                if (spt.IsOpen)
                {
                    try
                    {
                        for (int i = 0; i < 2; i++)
                        {
                            spt.Write(Number, 0, Number.Length);
                            Thread.Sleep(2000);
                        }
                    }
                    catch (Exception ex)
                    {                  
                        throw ex;
                    }
    
                }
    
                string dt = DateTime.Now.ToString();
                using (StreamWriter wirte=new StreamWriter (@"\ResidentFlash\SendData.txt",true))
                {
                    string wirteData = "";
                    foreach (byte var in Number)
                    {
                        wirteData += var.ToString();
                    }
                    wirte.WriteLine(wirteData + "---Systime---" + dt);
    
                }
            }
    
            /// <summary>
            /// 打开外部文件
            /// </summary>
            public void OpenOutFile()
            {
                ThreadWithState tws = new ThreadWithState(filename, null);
                StarThread = new Thread(new ThreadStart(tws.ThreadProc));
                StarThread.IsBackground = true;
                StarThread.Start();
            }
    
            /// <summary>
            /// 申明委托类(定义参数是方便线程实例化传参数)
            /// </summary>
            public class ThreadWithState
            {
                private string fileName;//文件路劲
                private string t_sp;
    
                public ThreadWithState(string fileName, string t_sp)
                {
                    this.fileName = fileName;
                    this.t_sp = t_sp;
                }
    
                public void ThreadProc()
                {
                    Process.Start(fileName, null);
                }
            }
    
            #endregion
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
               FileExists = FileRead(fileNamePath);
               if (FileExists)//文件存在,定时器执行打开串口主动发送数据
               {
                   FileExists_timer = true;
                   timer_task.Enabled = true;
                   timer_Send.Enabled = true;
               }
               else //文件不存在或者没有数据
               {
                   this.Width = 0;
                   this.Height = 0;
                   OpenOutFile();
                   this.Close();
               }
    
               int hTaskBarWnd = FindWindow("HHTaskBar", null);
               ShowWindow(hTaskBarWnd, 0);
            }
    
            /// <summary>
            /// 文件存在定时器30秒后打开外部程序
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void timer_task_Tick(object sender, EventArgs e)
            {
                if (FileExists_timer)
               {
                   if (spt.IsOpen)
                   {
                      spt.Close();
                   }
                   timer_task.Enabled = false;
                   OpenOutFile();
                   Thread.Sleep(1000);
                   this.Close();
                }
            }
    
            /// <summary>
            /// 打开串口,发送数据
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void timer_Send_Tick(object sender, EventArgs e)
            {
                if (FileExists)
                {
                    try
                    {
                        OpenSpt();
                        SendSpt(getLastNum[3]);
                        timer_Send.Enabled = false;
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                }
            }
    
        }
    }

    协议:

    本协议的通讯方式
    标准RS232通讯;波特率:9600;通讯格式:8N1,8位数据,无奇偶校验位,有1位停止位
    
    通信基本格式:
    起始符    信息类型    信息长度    信息内容    校验    结束符
    各部分定义如下:
    内容    定义
    起始符    0F,一个字节,十六进制码
    信息类型    一个字节,十六进制码(0F,F0,FF等保留码不用)
    信息长度    为2个字节,ASCII码(0~9,A~F,最大长度为256)
    信息内容    一组十六进制码,最大长度256
    校验    一个字节,十六进制码,是自信息类型起至对象号止所有码的异或和。
    结束符    F0,一个字节,十六进制码 (为了保证可靠性,车机下发的结束符为F0 FF)

    微软的msdn真的不错 呵呵

  • 相关阅读:
    Spring学习(九)
    NPOI的一些基本操作
    WebClient请求接口,get和post方法
    树结构关系的数据导出为excel
    AOP实践--利用MVC5 Filter实现登录状态判断
    js小结
    (转)基于http协议的api接口对于客户端的身份认证方式以及安全措施
    C# 下载文件 只利用文件的存放路径来下载
    linux nginx启动 重启 关闭命令
    两种 js下载文件的方法(转)
  • 原文地址:https://www.cnblogs.com/y112102/p/2570299.html
Copyright © 2011-2022 走看看