最近在做串口通信方面的程序,请问高手们怎样将从串口接收到的信息按二进制的形原样输出?
怎样将接收到的信息按照一定的规约解释出来?

解决方案 »

  1.   

    在C#里面有一个SerialPort类,专门用于串口操作,读取数据有一个事件DataReceived 
    比如:this._serialPort.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
                this._serialPort.ReceivedBytesThreshold = 1;
                 #region 接收串口数据
            private void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                try
                {
                    string strReceiveData = string.Empty;
                    byte[] buffer = Convert.FromBase64String(_serialPort.ReadLine());
                    strReceiveData  = Encoding.Unicode.GetString(buffer); 
    //.......                
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                    return;
                }
            }
            #endregion      
      

  2.   


    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.Ports; 
    using System.Threading; 
    using System.IO; 
    namespace SerialPorts 

         
        public partial class Form1 : Form 
        { 
            int year;//年 
            int month;//月 
            int day;//日 
            int hour;//小时 
            int minute;//分 
            int second;//秒 
            uint u_data;//用水量 
            int modify;//效验码 
            string message; 
            public Form1() 
            { 
                InitializeComponent();       
            } 
            private void btnSend_Click(object sender, EventArgs e) 
            { 
                timer1.Enabled = true; 
                year =Convert.ToInt32(DateTime.Now.Year.ToString().Substring(2)); 
                month = DateTime.Now.Month; 
                day = DateTime.Now.Day; 
                hour = DateTime.Now.Hour; 
                minute = DateTime.Now.Minute; 
                second = DateTime.Now.Second; 
                u_data = 1234; 
                modify = year + month + day + hour + minute + second + Convert.ToInt32(u_data.ToString().Substring(0, 2)) + Convert.ToInt32(u_data.ToString().Substring(2)); 
                 
                sendData(); 
                btnSend.Enabled = false; 
                btnReceive.Enabled = true; 
                MessageBox.Show("开始发送数据!"); 
            } 
            /// <summary> 
            /// 发送数据 
            /// <para>message --string 显示在界面的数据</para> 
            /// <para>data --byte[] 发送到缓存的数据</para> 
            /// </summary> 
            private void sendData() 
            { 
                message = ""; 
                byte[] data = { 0xAA, 0xAA, 0xAA, byte.Parse(year.ToString()), byte.Parse(month.ToString()), byte.Parse(day.ToString()), byte.Parse(hour.ToString()), byte.Parse(minute.ToString()), byte.Parse(second.ToString()), byte.Parse(u_data.ToString().Substring(0, 2)), byte.Parse(u_data.ToString().Substring(2)), byte.Parse(modify.ToString()) }; 
                foreach (byte s in data) 
                { 
                    message += s.ToString() + ","; 
                } 
                _serialPort.Write(data, 0, 12); 
                 
                lsbSendMessage.Items.Add(message.Substring(0, message.Length - 1));           
            } 
            private void btnReceive_Click(object sender, EventArgs e) 
            { 
                btnReceive.Enabled = false; 
                timer1.Enabled = false; 
                btnSend.Enabled = false; 
                chbCom1.Checked = false; 
                chbCom2.Checked = false; 
                MessageBox.Show(_serialPort.PortName + "口已断开!"); 
            } 
            private void timer1_Tick(object sender, EventArgs e) 
            { 
                timer1.Interval = 1000; 
                //btnSend_Click(sender, e); 
                sendData(); 
            } 
            private void Form1_Load(object sender, EventArgs e) 
            { 
                timer1.Enabled = false; 
                btnSend.Enabled = false; 
                btnReceive.Enabled = false; 
            } 
            private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) 
            { 
                byte[] receive= new byte[1024]; 
                _serialPort.Read(receive, 0, 3); 
                byte[] data ={ 0x55, 0x55, 0x55 };//硬件返回值 
               
                if (data[0] == receive[0])//应该比较3个,此处偷懒 
                { 
                    timer1.Enabled = false; 
                    btnSend.Enabled = false; 
                    message=receive[0]+","+receive[1]+","+receive[2]; 
                     
                    _serialPort.Close(); 
                    MessageBox.Show("数据已确认!"); 
                     
                } 
            } 
            /// <summary> 
            /// 打开串口 
            /// </summary> 
            /// <param name="com">串口名</param> 
            private void openCom(string com) 
            { 
                _serialPort.PortName = com;// SetPortName(_serialPort.PortName); 
                _serialPort.BaudRate = 9600;//SetPortBaudRate(_serialPort.BaudRate); 
                _serialPort.WriteBufferSize = 12; 
                _serialPort.ReadTimeout = 500; 
                _serialPort.WriteTimeout = 500; 
                _serialPort.Open(); 
                //还可以增加很多设置选项 
            } 
            private void chbCom1_CheckedChanged(object sender, EventArgs e) 
            { 
                timer1.Enabled = false; 
                btnReceive.Enabled = false; 
                if (chbCom1.Checked) 
                { 
                    if (chbCom2.Checked) 
                    { 
                         
                        chbCom2.Checked = false; 
                        _serialPort.Close(); 
                    } 
                    btnSend.Enabled = true; 
                    _serialPort.PortName = "com1"; 
                    openCom(_serialPort.PortName); 
                    MessageBox.Show("com1口连接成功!"); 
                } 
                else 
                { 
                    btnSend.Enabled = false; 
                    _serialPort.Close(); 
                    MessageBox.Show("com1口被断开!"); 
                } 
            } 
            private void chbCom2_CheckedChanged(object sender, EventArgs e) 
            { 
                timer1.Enabled = false; 
                btnReceive.Enabled = false; 
                if (chbCom2.Checked) 
                { 
                    if (chbCom1.Checked) 
                    { 
                        chbCom1.Checked = false; 
                        _serialPort.Close(); 
                    } 
                     
                    btnSend.Enabled = true; 
                    _serialPort.PortName = "com2"; 
                    openCom(_serialPort.PortName); 
                    MessageBox.Show("com2口连接成功!"); 
                } 
                else 
                { 
                    btnSend.Enabled = false; 
                    _serialPort.Close(); 
                    MessageBox.Show("com2口被断开!"); 
                } 
            } 
        }       
    }