【问题标题】:Barcode Scanner - Serial Port条码扫描器 - 串口
【发布时间】:2016-12-03 10:06:34
【问题描述】:

因此,我尝试将条形码扫描仪用作“串行”设备,而不是键盘模拟器,但它没有创建 com 端口。我已经扫描了将其设置为串行设备的手册中的设置代码,这似乎正确配置了扫描仪(它停止将扫描的代码发送到文本框\文本编辑器)但是因为没有 COM 端口,我不能当我扫描条形码时捕获数据......

Windows 在第一次插入时安装了驱动程序,没有提供磁盘\驱动程序...想知道是否有其他人遇到过同样的问题.....

这是我的代码....

class Program
{
    // Create the serial port with basic settings
    private SerialPort port = new SerialPort("com1", 9600, Parity.None, 8, StopBits.One);

    [STAThread]
    static void Main(string[] args)
    {
        new Program();
    }

    private Program()
    {

        string[] ports = System.IO.Ports.SerialPort.GetPortNames();

        Console.WriteLine("Incoming Data:");

        // Attach a method to be called when there
        // is data waiting in the port's buffer
        port.DataReceived += new
          SerialDataReceivedEventHandler(port_DataReceived);

        // Begin communications
        port.Open();

        // Enter an application loop to keep this thread alive
        Application.Run();
    }

    private void port_DataReceived(object sender,
      SerialDataReceivedEventArgs e)
    {
        // Show all the incoming data in the port's buffer
        Console.WriteLine(port.ReadExisting());
    }
}

当我尝试打开端口时,我收到错误消息.....'端口 'com1' 不存在'.....

当我创建一个虚拟端口(使用 3rd 方应用程序)时,代码运行但我仍然没有从扫描仪获取数据....

【问题讨论】:

  • 您必须编写一段代码才能连接到 COM 端口,如果不通过指定端口、波特率、数据位和其他一些参数明确连接到它,扫描仪将无法为您工作。它不同于在键盘模式下捕获数据。
  • @mauro21pl 是的,这样做了,添加了我的代码,我收到错误消息.....'端口'com1'不存在'.....当我尝试打开港口。也许我做错了什么......
  • 那将是“COM1”,而不是“com1”?不记得它是否像 DOS 时代那样区分大小写......只需调试 ports 中的值。
  • @Mikko Viitala 同样的错误...'端口'COM1'不存在。'在'port.Open();'线…。扫描仪已插入 USB,我原以为它会创建一个 COMn 端口,并且会在设备管理器中看到......但它不是......
  • 一旦您将扫描仪插入USB端口,即插即用,它应该安装并初始化扫描仪,并创建一个您应该能够在设备管理器中看到的COM端口。如果您没有看到它,请尝试将设备插入另一个 USB 端口,这可能会解决您的问题。一旦可以在设备管理器中访问扫描仪,它就是实际应用程序的起点

标签: c# serial-port barcode-scanner


【解决方案1】:

您可以使用以下代码。我可以打开我在特定端口中配置的 COM。 串口_serialPort;

    // delegate is used to write to a UI control from a non-UI thread
    private delegate void SetTextDeleg(string text);

    private void Form1_Load(object sender, EventArgs e)
    {
        // all of the options for a serial device
        // can be sent through the constructor of the SerialPort class
        // PortName = "COM1", Baud Rate = 19200, Parity = None, 
        // Data Bits = 8, Stop Bits = One, Handshake = None
        //_serialPort = new SerialPort("COM8", 19200, Parity.None, 8, StopBits.One);
        _serialPort = new SerialPort("COM8", 19200, Parity.None, 8, StopBits.One);
        _serialPort.Handshake = Handshake.None;
        _serialPort.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
        _serialPort.ReadTimeout = 500;
        _serialPort.WriteTimeout = 500;
        _serialPort.Open();
    }

【讨论】:

    【解决方案2】:

    我正在编写自己的条形码脚本。我的扫描仪默认为即插即用 USB-HID...人机接口设备...而不是 USB-COMn 端口。我必须扫描条形码才能将其切换到串行端口模式。您可以在设备管理器树中观察转换过程……作为“端口”分支萌芽,其中包含条形码扫描仪的详细信息。我的 COM3。

    【讨论】:

    • 只有知道即插即用设置并不能保证您会看到 COM 端口...当默认设置为 HID 时才会有所帮助。我很好奇。现在我可以打开 COM 端口了……但我没有收到任何数据。有什么建议吗?
    【解决方案3】:

    我只是新手,我正在执行任务 - 通过串口从条形码扫描仪接收数据......我花了很多时间......我有下一个结果

    using System.IO.Ports;
    using System.Timers;
    
    namespace BarCode_manager
    {
        public partial class MainWindow : Window
        {
    
            private static SerialPort currentPort = new SerialPort();
            private static System.Timers.Timer aTimer;
    
            private delegate void updateDelegate(string txt);
    
            public MainWindow()
            {
                InitializeComponent();
                currentPort.PortName = "COM6";
                currentPort.BaudRate = 9600;
                currentPort.ReadTimeout = 1000;
    
                aTimer = new System.Timers.Timer(1000);
                aTimer.Elapsed += OnTimedEvent;
                aTimer.AutoReset = true;
                aTimer.Enabled = true;
            }
    
            private void OnTimedEvent(object sender, ElapsedEventArgs e)
            {
               if (!currentPort.IsOpen)
                {
                    currentPort.Open();
                    System.Threading.Thread.Sleep(100); /// for recieve all data from scaner to buffer
                    currentPort.DiscardInBuffer();      /// clear buffer          
                }
                try
                {
                    string strFromPort = currentPort.ReadExisting();
                    lblPortData.Dispatcher.BeginInvoke(new updateDelegate(updateTextBox), strFromPort);
                }
                catch { }
            }
    
            private void updateTextBox(string txt)
            {
                if (txt.Length != 0)
                {
                    aTimer.Stop();
                    aTimer.Dispose();
                    txtReceive.Text = Convert.ToString(aTimer.Enabled);
                    currentPort.Close();
                }
                lblPortData.Text = txt;
                lblCount.Content = txt.Length;
                txtReceive.Text = Convert.ToString(aTimer.Enabled);
            }          
    
            private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
            {
                if (currentPort.IsOpen)
                    currentPort.Close();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多