zoukankan      html  css  js  c++  java
  • 【原创】串口通信测试程序

    1.jpg.jpg

    源代码:

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


    namespace 串口通信
    {
        public partial class frmMain : Form
        {
            public frmMain()
            {
                InitializeComponent();
            }

            public int iPort = 1; //1,2,3,4
            public int iRate = 9600; //1200,2400,4800,9600
            public byte bSize = 8; //8 bits
            public byte bParity = 0; // 0-4=no,odd,even,mark,space
            public byte bStopBits = 1; // 0,1,2 = 1, 1.5, 2
            public int iTimeout = 1000;
            public myCom com = new myCom();
            public byte[] recb;
            public int nub = 0;


            //打开串口
            public bool openCom()
            {
                try {
                    if (com.Opened)
                    {
                        com.Close();
                        com.Open();
                    }
                    else
                    {
                        com.Open();
                    }
                    return true;
                
                }catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return false;
                }

            }

            //显示包信息
            public string disPackage(byte[] reb)
            {
                string temp = "";
                foreach (byte b in reb)
                    temp += b.ToString("X2") + " ";
                return temp;
                
            }

            //去掉字符数组中的空格
            public string delSpace(string input)
            {
                string output = "";
                for(int i=0;i<input.Length;i++)
                {
                    if(input!=' ')
                        output += input;
                }
                return output;
            }

            //发送数据包
            public void sendPackage(byte[] bb)
            {
                int sendNum = 0;
                try
                {
                    sendNum = com.Write(bb);
                    Thread.Sleep(50);
                    this.txtShow.AppendText("\r\n发送数据:"+disPackage(bb));
                    recb = com.Read(50);
                    this.txtShow.AppendText("\r\n接收到数据:" + disPackage(recb));

                }catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

            //提取发送的数据包
            public byte[] sendDB()
            {

                    string temp = delSpace(this.txtSend.Text.Trim());
                    byte[] strTemp = new byte[50];
                    int j = 0;
                    try
                    {
                         for (int i = 0; i < temp.Length; i = i + 2, j++)
                         strTemp[j] = Convert.ToByte(temp.Substring(i, 2), 16);
                    }catch(Exception ex)
                    {
                        MessageBox.Show(ex.Message);
                    }

                    byte[] send = new byte[j];
                    Array.Copy(strTemp, send, j);
                    return send;

                
            }
            
            //点击发送按钮发送数据
            private void button4_Click(object sender, EventArgs e)
            {
                if (this.txtSend.Text == "")
                {
                    MessageBox.Show("发送数据为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }


                if (com.Opened)
                {
                    byte[] temp = sendDB();
                    sendPackage(temp);
                }
                else
                {
                    MessageBox.Show("串口已经关闭!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return;
                }

            }


            //程序开启,串口初始化
            private void Form1_Load(object sender, EventArgs e)
            {
                this.timer1.Enabled = true;

                this.cboRate.SelectedIndex =5;
                this.cboPortNo.SelectedIndex=0;
                this.cboByteSize.SelectedIndex=3;
                this.cboStopByte.SelectedIndex=1;
                this.cboParity.SelectedIndex=0;
                   
                com.PortNum = iPort;
                com.BaudRate = iRate;
                com.ByteSize = bSize;
                com.Parity = bParity;
                com.StopBits = bStopBits;
                com.ReadTimeout = iTimeout;

                if(this.openCom())
                {
                    this.txtShow.AppendText("串口初始化成功!...");
                }else{
                    this.txtShow.AppendText("串口初始化失败!");
                }

            }


            //保存配置
            private void button1_Click(object sender, EventArgs e)
            {
                switch (this.cboPortNo.SelectedIndex)
                {
                    case 0:
                        iPort = 1;
                        break;
                    case 1:
                        iPort = 2;
                        break;
                    case 2:
                        iPort = 3;
                        break;
                    case 3:
                        iPort = 4;
                        break;

                }
                //MessageBox.Show(iPort.ToString());

                switch (this.cboParity.SelectedIndex)
                {
                    case 0:
                        bParity = 0;
                        break;
                    case 1:
                        bParity = 1;
                        break;
                    case 2:
                        bParity = 2;
                        break;
                    case 3:
                        bParity = 3;
                        break;
                    case 4:
                        bParity = 4;
                        break;
                }
                //MessageBox.Show(bParity.ToString());

                switch (this.cboStopByte.SelectedIndex)
                {
                    case 0:
                        bStopBits =0;
                        break;
                    case 1:
                        bStopBits = 1;
                        break;
                    case 2:
                        bStopBits = 2;
                        break;

                }
                //MessageBox.Show(bParity.ToString());

                com.PortNum = Convert.ToInt16(iPort);
                com.BaudRate = Convert.ToInt16(this.cboRate.Text);
                com.ByteSize = Convert.ToByte(this.cboByteSize.Text,10);
                com.Parity = Convert.ToByte(bParity);
                com.StopBits = Convert.ToByte(bStopBits);

                if(this.openCom())
                {
                    this.txtShow.AppendText("\r\n串口参数设置成功!...");
                }else
                {
                    this.txtShow.AppendText("\r\n串口参数设置失败!");
                }
            }

            private void button3_Click(object sender, EventArgs e)
            {
                this.Dispose();
            }

            private void button5_Click(object sender, EventArgs e)
            {
                this.txtSend.Text = string.Empty;
               // this.textBox2.Text = "";
            }

    //打开关闭按钮
            private void button2_Click(object sender, EventArgs e)
            {
                if (this.btnCloseCom.Text == "关闭串口")
                {
                    this.btnCloseCom.Text = "打开串口";
                    this.txtShow.AppendText("\r\n串口被关闭!");
                    this.cboPortNo.Enabled = true;
                    com.Close();
                }
                else
                {
                    this.btnCloseCom.Text = "关闭串口";
                    this.txtShow.AppendText("\r\n串口成功开启!...");
                    this.cboPortNo.Enabled = false;
                    com.Open();
                }
            }

            //打开关于窗口
            private void button2_Click_1(object sender, EventArgs e)
            {
                frmAbout frm = new frmAbout();
                frm.Show();
            }

            

            private void btnClearShow_Click(object sender, EventArgs e)
            {
                this.txtShow.Text = "";
            }

            private void timer1_Tick(object sender, EventArgs e)
            {
                this.TsslDate.Text = DateTime.Now.ToString();
                this.TsslWeek.Text = DateTime.Now.ToString("dddd");
            }

            private void button1_Click_1(object sender, EventArgs e)
            {
                Help.ShowHelp(this, Application.StartupPath + "\\Readme.chm");
            }


        }
    }


    本程序需要用到一个C++写的dll,功能是帮助初始化串口。(该dll文件已经放在bin\debug目录下)
    以下是串口通信类:


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Configuration;

    namespace 串口通信
    {
       public  class myCom
        {
           public myCom()
                    {
                    }
                    public int PortNum; //1,2,3,4
                    public int BaudRate; //1200,2400,4800,9600
                    public byte ByteSize; //8 bits
                    public byte Parity; // 0-4=no,odd,even,mark,space
            public byte StopBits; // 0,1,2 = 1, 1.5, 2
                    public int ReadTimeout; //10
      
                    //comm port win32 file handle
                    private int hComm = -1;

                    public bool Opened = false;
       
                    //win32 api constants
                    private const uint GENERIC_READ = 0x80000000;
                    private const uint GENERIC_WRITE = 0x40000000;
                    private const int OPEN_EXISTING = 3;  
                    private const int INVALID_HANDLE_VALUE = -1;
      
                    [StructLayout(LayoutKind.Sequential)]
                            private struct DCB
                    {
                            //taken from c struct in platform sdk
                            public int DCBlength;           // sizeof(DCB)
                            public int BaudRate;            // current baud rate
                            public int fBinary;          // binary mode, no EOF check
                            public int fParity;          // enable parity checking
                            public int fOutxCtsFlow;      // CTS output flow control
                            public int fOutxDsrFlow;      // DSR output flow control
                            public int fDtrControl;       // DTR flow control type
                            public int fDsrSensitivity;   // DSR sensitivity
                            public int fTXContinueOnXoff; // XOFF continues Tx
                            public int fOutX;          // XON/XOFF out flow control
                            public int fInX;           // XON/XOFF in flow control
                            public int fErrorChar;     // enable error replacement
                            public int fNull;          // enable null stripping
                            public int fRtsControl;     // RTS flow control
                            public int fAbortOnError;   // abort on error
                            public int fDummy2;        // reserved
                            public ushort wReserved;          // not currently used
                            public ushort XonLim;             // transmit XON threshold
                            public ushort XoffLim;            // transmit XOFF threshold
                            public byte ByteSize;           // number of bits/byte, 4-8
                            public byte Parity;             // 0-4=no,odd,even,mark,space
                public byte StopBits;           // 0,1,2 = 1, 1.5, 2
                            public char XonChar;            // Tx and Rx XON character
                            public char XoffChar;           // Tx and Rx XOFF character
                            public char ErrorChar;          // error replacement character
                            public char EofChar;            // end of input character
                            public char EvtChar;            // received event character
                            public ushort wReserved1;         // reserved; do not use
                    }

                    [StructLayout(LayoutKind.Sequential)]
                            private struct COMMTIMEOUTS
                    {  
                            public int ReadIntervalTimeout;
                            public int ReadTotalTimeoutMultiplier;
                            public int ReadTotalTimeoutConstant;
                            public int WriteTotalTimeoutMultiplier;
                            public int WriteTotalTimeoutConstant;
                    }  

                    [StructLayout(LayoutKind.Sequential)]
                            private struct OVERLAPPED
                    {
                            public int  Internal;
                            public int  InternalHigh;
                            public int  Offset;
                            public int  OffsetHigh;
                            public int hEvent;
                    }  
      
                    [DllImport("kernel32.dll")]
                    private static extern int CreateFile(
                            string lpFileName,                         // file name
                            uint dwDesiredAccess,                      // access mode
                            int dwShareMode,                          // share mode
                            int lpSecurityAttributes, // SD
                            int dwCreationDisposition,                // how to create
                            int dwFlagsAndAttributes,                 // file attributes
                            int hTemplateFile                        // handle to template file
                            );
                    [DllImport("kernel32.dll")]
                    private static extern bool GetCommState(
                            int hFile,  // handle to communications device
                            ref DCB lpDCB    // device-control block
                            );
                    [DllImport("kernel32.dll")]
                    private static extern bool BuildCommDCB(
                            string lpDef,  // device-control string
                            ref DCB lpDCB     // device-control block
                            );
                    [DllImport("kernel32.dll")]
                    private static extern bool SetCommState(
                            int hFile,  // handle to communications device
                            ref DCB lpDCB    // device-control block
                            );
                    [DllImport("kernel32.dll")]
                    private static extern bool GetCommTimeouts(
                            int hFile,                  // handle to comm device
                            ref COMMTIMEOUTS lpCommTimeouts  // time-out values
                            );
                    [DllImport("kernel32.dll")]
                    private static extern bool SetCommTimeouts(
                            int hFile,                  // handle to comm device
                            ref COMMTIMEOUTS lpCommTimeouts  // time-out values
                            );
                    [DllImport("kernel32.dll")]
                    private static extern bool ReadFile(
                            int hFile,                // handle to file
                            byte[] lpBuffer,             // data buffer
                            int nNumberOfBytesToRead,  // number of bytes to read
                            ref int lpNumberOfBytesRead, // number of bytes read
                            ref OVERLAPPED lpOverlapped    // overlapped buffer
                            );
                    [DllImport("kernel32.dll")]
                    private static extern bool WriteFile(
                            int hFile,                    // handle to file
                            byte[] lpBuffer,                // data buffer
                            int nNumberOfBytesToWrite,     // number of bytes to write
                            ref int lpNumberOfBytesWritten,  // number of bytes written
                            ref OVERLAPPED lpOverlapped        // overlapped buffer
                            );
                    [DllImport("kernel32.dll")]
                    private static extern bool CloseHandle(
                            int hObject   // handle to object
                            );
                    [DllImport("Comm.dll")]
                            public static extern void Init_Comm();
      
                    public void Open()
                    {
                Init_Comm();
                            DCB dcbCommPort = new DCB();
                            COMMTIMEOUTS ctoCommPort = new COMMTIMEOUTS();
       
       
                            // OPEN THE COMM PORT.

       
                            hComm = CreateFile("COM" + PortNum ,GENERIC_READ | GENERIC_WRITE,0, 0,OPEN_EXISTING,0,0);
      
                            // IF THE PORT CANNOT BE OPENED, BAIL OUT.
                            if(hComm == INVALID_HANDLE_VALUE)
                            {
                                    throw(new ApplicationException("Comm Port Can Not Be Opened"));
                            }
      
                            // SET THE COMM TIMEOUTS.
       
                            GetCommTimeouts(hComm,ref ctoCommPort);
                            ctoCommPort.ReadTotalTimeoutConstant = ReadTimeout;
                            ctoCommPort.ReadTotalTimeoutMultiplier = 0;
                            ctoCommPort.WriteTotalTimeoutMultiplier = 0;
                            ctoCommPort.WriteTotalTimeoutConstant = 0;  
                            SetCommTimeouts(hComm,ref ctoCommPort);
      
                            // SET BAUD RATE, PARITY, WORD SIZE, AND STOP BITS.
                            // THERE ARE OTHER WAYS OF DOING SETTING THESE BUT THIS IS THE EASIEST.
                            // IF YOU WANT TO LATER ADD CODE FOR OTHER BAUD RATES, REMEMBER
                            // THAT THE ARGUMENT FOR BuildCommDCB MUST BE A POINTER TO A STRING.
                            // ALSO NOTE THAT BuildCommDCB() DEFAULTS TO NO HANDSHAKING.
      
                            dcbCommPort.DCBlength = Marshal.SizeOf(dcbCommPort);
                            GetCommState(hComm, ref dcbCommPort);
                            dcbCommPort.BaudRate=BaudRate;
                            dcbCommPort.Parity=Parity;
                            dcbCommPort.ByteSize=ByteSize;
                            dcbCommPort.StopBits=StopBits;
                            SetCommState(hComm, ref dcbCommPort);
       
                            Opened = true;
       
                    }
      
                    public void Close()
                    {
                            if (hComm!=INVALID_HANDLE_VALUE)
                            {
                                    CloseHandle(hComm);
                    Opened=false;
                            }
                    }
      
                    public byte[] Read(int NumBytes)
                    {
                            byte[] BufBytes;
                            byte[] OutBytes;
                            BufBytes = new byte[NumBytes];
                            if (hComm!=INVALID_HANDLE_VALUE)
                            {
                                    OVERLAPPED ovlCommPort = new OVERLAPPED();
                                    int BytesRead=0;
                                    ReadFile(hComm,BufBytes,NumBytes,ref BytesRead,ref ovlCommPort);
                                    OutBytes = new byte[BytesRead];
                                    Array.Copy(BufBytes,OutBytes,BytesRead);
                            }
                            else
                            {
                                    throw(new ApplicationException("Comm Port Not Open"));
                            }
                            return OutBytes;
                    }
      
                    public int Write(byte[] WriteBytes)
                    {
                            int BytesWritten = 0;
                            if (hComm!=INVALID_HANDLE_VALUE)
                            {
                                    OVERLAPPED ovlCommPort = new OVERLAPPED();
                                    WriteFile(hComm,WriteBytes,WriteBytes.Length,ref BytesWritten,ref ovlCommPort);
                            }
                            else
                            {
                                    throw(new ApplicationException("Comm Port Not Open"));
                            }  
                            return BytesWritten;
                    }

        }
    }
  • 相关阅读:
    Unity资源打包之Assetbundle
    集社交与金融为一体,平安天下通怎样推动互联网金融创新?
    json和pickle模块
    sys模块
    os模块
    random模块
    datetime模块
    time模块
    logging模块

  • 原文地址:https://www.cnblogs.com/kingboy2008/p/2055601.html
Copyright © 2011-2022 走看看