C#2005 程序 用serialPort1控件
条码扫描仪扫描下条形码,读出条形码信息(唯一商品编号,例如* kele-001 *),并更改该商品在数据库中的库存。
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
我查到有这样个方法,但不知道具体怎么用。谁能给出段具体代码,要代码。
代码关键:我声明个string strNO = ""; ,如何获取strNO = "* kele-001 *" 这个过程。
另外,还有没有串口通信该注意的事项。例如一旦com1口接收到数据,程序会不会死掉,如何避免等。

解决方案 »

  1.   

    串口接收到的是位元組,SerialPort 中相關函式可以查看收到多少位元組,若程式寫的正確是不會死掉的。建議你寫一段簡單的串口操作(open, close, read, write)程式,實際演練就會知道怎回事了。
    網路有很多串口的教學,供你參考。
      

  2.   


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO.Ports;
    using System.Threading;
    using System.Windows.Forms;namespace BHTC_Packing
    {
        public class Scanner
        {
            public SerialPort s_Serial;
            public bool scanCOMIsOK = true;
            public string s_buffer = string.Empty;
            public bool readCode = false;        public delegate void OnSerialNumberReceivedHandle(string sn);
            public event OnSerialNumberReceivedHandle OnSerialNumberRecieved;        private string data = string.Empty;
            public string Data
            {
                get
                {
                    return data;
                }
            }        public bool Init()
            {
                try
                {
                    if (!s_Serial.IsOpen)
                    {
                        s_Serial.Open();
                        scanCOMIsOK = true;
                    }
                }
                catch
                {
                    scanCOMIsOK = false;
                }            return scanCOMIsOK;
            }        public Scanner()
            {
                string scanComPort = BHTC_Packing.Properties.Settings.Default.Scanner_Port;
                int scanBaudRate = BHTC_Packing.Properties.Settings.Default.Scanner_BaudRate;            s_Serial = new SerialPort();
                s_Serial.PortName = scanComPort;
                s_Serial.BaudRate = scanBaudRate;
                s_Serial.DataBits = 7;
                s_Serial.StopBits =  StopBits.One;
                s_Serial.Parity = Parity.Even;
                s_Serial.Handshake = Handshake.None;            s_Serial.DataReceived += new SerialDataReceivedEventHandler(s_Serial_DataReceived);
            }        void s_Serial_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                //Thread.Sleep(500);
                string temp = s_Serial.ReadExisting();
                Thread.Sleep(200);
                s_buffer += temp;            if (s_buffer.IndexOf("\r") >= 0)
                {
                    readCode = true;
                    data=s_buffer;                if (OnSerialNumberRecieved != null)
                    {
                        OnSerialNumberRecieved(s_buffer.Replace("\r", string.Empty));
                    }
                }
            }
            public void openScaner()
            {
                readCode = false;
                s_buffer = string.Empty;            byte[] openOrder ={ 0x16, 0x54, 0xD };
                if (!s_Serial.IsOpen)
                {
                    s_Serial.Open();
                }
                s_Serial.Write(openOrder, 0, 3);
                //Thread.Sleep(100);        }
            public void closeScaner()
            {
                byte[] closeOrder ={ 0x16, 0x55, 0xD };
                if (!s_Serial.IsOpen)
                {
                    s_Serial.Open();
                }
                s_Serial.Write(closeOrder, 0, 3);
                //Thread.Sleep(100);
            }        public bool CodeReceived
            {
                get
                {
                    return readCode;
                }
            }
        }
    }