【原创】串口通信测试程序

来源:互联网 发布:郑州办公软件培训班 编辑:程序博客网 时间:2024/04/30 15:36

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

    }
}
原创粉丝点击