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真的不错 呵呵

  • 相关阅读:
    一个好的时间函数
    Codeforces 785E. Anton and Permutation
    Codeforces 785 D. Anton and School
    Codeforces 510 E. Fox And Dinner
    Codeforces 242 E. XOR on Segment
    Codeforces 629 E. Famil Door and Roads
    Codeforces 600E. Lomsat gelral(Dsu on tree学习)
    Codeforces 438D The Child and Sequence
    Codeforces 729E Subordinates
    【ATcoder】D
  • 原文地址:https://www.cnblogs.com/y112102/p/2570299.html
Copyright © 2011-2022 走看看