C#-SerialDataReceivedEventHandler在第二个事件上执行(始终跳过第一个事件)

C#-SerialDataReceivedEventHandler在第二个事件上执行(始终跳过第一个事件),c#,wpf,serial-port,visual-studio-2019,barcode-scanner,C#,Wpf,Serial Port,Visual Studio 2019,Barcode Scanner,我有使用COM4端口的条形码扫描仪。 每次我扫描某样东西时,程序会在第二次扫描后开始读取条形码 所以,我建立了一个项目,试图扫描,但什么都没有发生。我尝试再次扫描(在这个正在运行的项目中),它开始完美地工作 在项目顶部,我声明端口为: SerialPort port = new SerialPort(); 我有一个定义端口的方法: public void ScannerPortSetup() { port.PortName = "COM4";

我有使用COM4端口的条形码扫描仪。 每次我扫描某样东西时,程序会在第二次扫描后开始读取条形码

所以,我建立了一个项目,试图扫描,但什么都没有发生。我尝试再次扫描(在这个正在运行的项目中),它开始完美地工作

在项目顶部,我声明端口为:

SerialPort port = new SerialPort();
我有一个定义端口的方法:

public void ScannerPortSetup()
{
        port.PortName = "COM4";               
        port.BaudRate = 9600;
        port.Handshake = Handshake.None;
        port.Parity = Parity.None;
        port.DataBits = 8;
        port.StopBits = StopBits.One;
        port.DtrEnable = true;
        port.ReadTimeout = 200;

        try
        {
            port.Open();
            
            if (port.IsOpen == true)
            {
                port.DataReceived += new SerialDataReceivedEventHandler(Recieve);
                
             }

            else
            {
                //print not opened
            }
        }

        catch (Exception e)
        {
            MessageBox.Show("Error on com4: " + e);
        }
 }
定义已接收操作的方法:

    private void Recieve(object sender, SerialDataReceivedEventArgs e)
    {

        String recieved_data = port.ReadExisting();
   
        this.Dispatcher.Invoke(() =>
        {
            if (currentScreenName == ApplicationPages.SkladisteScreen.ToString())
            {
                MessageBox.Show("scanned completed:  " + recieved_data);
            }
           

        }); 
    }
再一次,我不知道为什么它不能在第一个事件中触发,但从第二个事件开始,它就完美地工作了。 不管我是将MessageBox放在这个.Dispatcher.Invoke()中还是放在Recieve方法的上面。似乎Receive不是第一次被解雇


有什么想法吗?

请在打开之前尝试DataReceived事件注册。并将RtsEnable设置为true。不工作:(可能我在错误的时间启动了ScenerPortSetup()?我在MainWindow.xaml.cs中启动它,在MainWindow加载后,代理设置并显示名为MainFrame.content的页面,这也可能是串行驱动程序的问题。您是否可以尝试使用串行终端(如HTerm)要检查是否在那里接收到第一个数据?HTerm显示了相同的行为-跳过第一次扫描,然后它正常工作。然而,我发现,当我连接设备时,它显示DSR就绪。当第一次扫描发生时,什么也没有发生,但设备关闭DSR,扫描正常工作。因此,这取决于设备。我必须联系制造商呃。