有一个蓝牙扫描枪,与电脑建立蓝牙连接后,希望扫描枪扫描的时候将条形码读到输入焦点的文版本框中,编程如何实现呢?
下面是我的实现方式,但是没有办法获取到扫描枪扫描的条形码,
代码说明:
1、cboxComin为选择输入端口的Combox控件,cboxComout为选择输出端口的Combox控件
2、lboxBarcode为ListView控件,用来显示扫描的条形码
 public partial class frmBluetooth : Form
    {
        SerialPort serialIn;
        SerialPort serialOut;        Thread rcvThread;
        bool disconnectRequested = false;               public frmBluetooth()
        {
            InitializeComponent();
        }        private void frmBluetooth_Load(object sender, EventArgs e)
        {
            string[] ports = SerialPort.GetPortNames();            for (int i = 0; i < ports.Length; i++)
            {
                cboxComin.Items.Add(ports[i]);
                cboxComout.Items.Add(ports[i]);
            }
        }        private void btnConnect_Click(object sender, EventArgs e)
        {
            serialIn = new SerialPort(this.cboxComin.SelectedItem.ToString());
            serialIn.ReadTimeout = 3000;
            serialOut = new SerialPort(this.cboxComout.SelectedItem.ToString());
            serialOut.ReadTimeout = 3000;
            try
            {
                if (!serialIn.IsOpen)
                {
                    serialIn.Open();
                }                if (!serialOut.IsOpen)
                {
                    serialOut.Open();
                }
               
                rcvThread = new Thread(new ThreadStart(ReceiveData));                rcvThread.Start();
          
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }        }        private void ReceiveData()
        {
            while (!disconnectRequested)
            {
                try
                {
                    string line = serialIn.ReadLine();
                    if (line.CompareTo("quit$$$") == 0)
                    {
                        disconnectRequested = true;
                        continue;
                    }
                    if (!string.IsNullOrEmpty(line))
                    {
                        this.lboxBarcode.Items.Add(line);
                    }
                }
                catch
                { }
               
            }
            if (disconnectRequested)
            {
                serialIn.Close();
                serialOut.Close();
            }        }        private void btnDisconnect_Click(object sender, EventArgs e)
        {
            try
            {
                disconnectRequested = true;
                serialOut.WriteLine("quit$$$");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

解决方案 »

  1.   

    ReceiveData会被执行吗,也就是说,底层接收到数据没?
      

  2.   


    谢谢!
    执行是可以执行的,但是string line = serialIn.ReadLine();
    时候会抛出异常,超时,也就是没有读取到数据!
      

  3.   

    ReceiveData方法中不断的循环读取端口的输入,但是获取不到数据,catch中捕获异常:操作超时;
    连接时执行: serialIn.Open();
    后,蓝牙适配器上的指示灯显示已连接。但是还是没有办法获取到数据不知道我采用这种方法获取扫描枪读取的条形码思路是否正确呢?
      

  4.   

    谢谢大家,现在已经能获取到数据了!不使用多线程检测端口,而是使用 private void btnConnect_Click(object sender, EventArgs e)
            {
                serialIn = new SerialPort(this.cboxComin.SelectedItem.ToString());
                serialIn.ReadTimeout = 3000;
                serialOut = new SerialPort(this.cboxComout.SelectedItem.ToString());
                serialOut.ReadTimeout = 3000;
                try
                {
                    if (!serialIn.IsOpen)
                    {
                        serialIn.Open(); 
                        serialIn.DataReceived += new SerialDataReceivedEventHandler(serialIn_DataReceived);
                    }                if (!serialOut.IsOpen)
                    {
                        serialOut.Open();
                    }
                   
                  
              
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }        }
      

  5.   

    你只是开启一个线程但没有看到你对这个端口的监听!不管什么样的设备我们需要做的就是对一个SerialPort进行监听。收到数据后对数据后去做处理..以前做串口与U口的扫描设备,有的设备是带SDK的..如硬件提供了SDK别的工作就不用作了.看懂他们的DEMO就行了..

    rcvThread = new Thread(new ThreadStart(ReceiveData));
    换成:serialIn.DataReceived+=new SerialDataReceivedEventHandler(dataReceived);
    serialOut.DataReceived+=new SerialDataReceivedEventHandler(dataReceived);