C#和串行通信如何刷新设备以再次读取相同的数据?

C#和串行通信如何刷新设备以再次读取相同的数据?,c#,.net,serial-port,reset,flush,C#,.net,Serial Port,Reset,Flush,好吧,我被困了将近20天,现在又遇到了同样的串行通信设备问题。我有一个硬件传感器,可以读取标签,并在每次通过串行com端口1或3读取时返回标签代码。我使用的任何一个都不重要。我正在使用我用c语言编写的程序来处理传入的数据。 现在的问题是,例如: 我的传感器读取带有代码“e2 0 10 1 83 10 1 23 7 0 d0 c0 1 be”的标签 除非我打开传感器并再次打开(电源复位),否则它不会再次读取此标签。因此,在我关闭端口之前,我无法想出如何使我的传感器忘记它读取的所有数据请任何人帮忙,

好吧,我被困了将近20天,现在又遇到了同样的串行通信设备问题。我有一个硬件传感器,可以读取标签,并在每次通过串行com端口1或3读取时返回标签代码。我使用的任何一个都不重要。我正在使用我用c语言编写的程序来处理传入的数据。 现在的问题是,例如: 我的传感器读取带有代码“e2 0 10 1 83 10 1 23 7 0 d0 c0 1 be”的标签 除非我打开传感器并再次打开(电源复位),否则它不会再次读取此标签。因此,在我关闭端口之前,我无法想出如何使我的传感器忘记它读取的所有数据请任何人帮忙,我现在很绝望 有人告诉我,我们需要用一些命令向设备写入数据,但他只知道这些。 以下是当前代码:

 void IntializeSensor()
    {
        try
        {
            if (mySerialPort==null)
            {
                mySerialPort = new SerialPort("COM3");

                mySerialPort.BaudRate = 9600;
                mySerialPort.Parity = Parity.None;

                mySerialPort.StopBits = StopBits.One;
                mySerialPort.DataBits = 8;
                mySerialPort.ReadTimeout = 2000;
                mySerialPort.Handshake = Handshake.None;
                LoglistBox.Items.Add("--Port Intilalized at COM1--");
                mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
            }

        }
        catch (Exception ex)
        {

            MessageBox.Show(ex.Message);
        }
    }
  void OpenPort()
    {
        try
        {
            str = "";

            if (mySerialPort.IsOpen)
            {
                ClosePort();
                Thread.Sleep(6000);

            }
            mySerialPort.Open();

            LoglistBox.Items.Add("--Port Opened at COM1 Success--");
        }
        catch (Exception ex)
        {


            LoglistBox.Items.Add("--Port Opened Failed--Error: "+ex.Message);
        }
    }
void ClosePort() {

        try
        {
            mySerialPort.Write("ABCABCABCABCABC");
            mySerialPort.DiscardInBuffer();
            mySerialPort.DiscardOutBuffer();
            mySerialPort.Dispose();
            mySerialPort.Close();

            LoglistBox.Items.Add("--Port Closed at COM1 Success--");
        }
        catch (Exception ex)
        {

            LoglistBox.Items.Add("--Port Closed Failed--Error: " + ex.Message);
            MessageBox.Show(ex.Message);
        }

    }
        try
        {

            if (e.EventType != SerialData.Chars) return; 
            SerialPort COMPort = (SerialPort)sender;

            int bytes = COMPort.BytesToRead;

            //create a byte array to hold the awaiting data

            byte[] comBuffer = new byte[bytes];

            //read the data and store it

            COMPort.Read(comBuffer, 0, bytes);



            // System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();

            str = ByteArrayToHexString(comBuffer);

            holdfirstvalue += str;
            //str = str +" "+ str;
            //MessageBox.Show("after concat "+str);


            if (str.Contains("FF") || str.Contains("F F") || str.Contains("F"))
            {


             SetText(holdfirstvalue.ToString());// ONE TAG CODE SENT TO BE SET IN LIST
                str = "";
                holdfirstvalue = "";
            }

        }

        catch (Exception ex)
        {
           // LoglistBox.Items.Add("--Port Opened Failed--Error: " + ex.InnerException);
            MessageBox.Show(ex.Message+" "+ex.InnerException);
        } 

    }
私有void DataReceivedHandler(对象发送方,SerialDataReceivedEventArgs e) {

        try
        {
            mySerialPort.Write("ABCABCABCABCABC");
            mySerialPort.DiscardInBuffer();
            mySerialPort.DiscardOutBuffer();
            mySerialPort.Dispose();
            mySerialPort.Close();

            LoglistBox.Items.Add("--Port Closed at COM1 Success--");
        }
        catch (Exception ex)
        {

            LoglistBox.Items.Add("--Port Closed Failed--Error: " + ex.Message);
            MessageBox.Show(ex.Message);
        }

    }
        try
        {

            if (e.EventType != SerialData.Chars) return; 
            SerialPort COMPort = (SerialPort)sender;

            int bytes = COMPort.BytesToRead;

            //create a byte array to hold the awaiting data

            byte[] comBuffer = new byte[bytes];

            //read the data and store it

            COMPort.Read(comBuffer, 0, bytes);



            // System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();

            str = ByteArrayToHexString(comBuffer);

            holdfirstvalue += str;
            //str = str +" "+ str;
            //MessageBox.Show("after concat "+str);


            if (str.Contains("FF") || str.Contains("F F") || str.Contains("F"))
            {


             SetText(holdfirstvalue.ToString());// ONE TAG CODE SENT TO BE SET IN LIST
                str = "";
                holdfirstvalue = "";
            }

        }

        catch (Exception ex)
        {
           // LoglistBox.Items.Add("--Port Opened Failed--Error: " + ex.InnerException);
            MessageBox.Show(ex.Message+" "+ex.InnerException);
        } 

    }

从你的评论中我了解到,即使是附带的程序也不会连续两次读取相同的条形码。我说的对吗

在我看来,“标签阅读器制造商”可能有意地设置了该机制,以防止用户在结账时错误地扫描一个项目两次。因为经常发生的情况是,相同的内容留在扫描仪上,或者在移动东西时与扫描仪交叉几次

除非您可以访问扫描仪固件并能够自己进行更改,否则我会说联系制造商。我会直接联系制造商并询问此事。对于多次扫描同一项目的特殊情况,应该有一个命令告诉扫描仪“退出锁定模式并重新启动扫描”(例如,购买多件类似物品。)

他们应该为您提供一份手册,其中列出了您可以发送到设备的所有命令,您可以使用这些命令来构建系统

还有一件事要尝试!您是否可以使用“Real Term”或任何其他终端监控应用程序查看您的串行端口,以查看在您再次扫描相同项目后扫描仪是否将代码发送到PC?这有助于您隔离问题,以确定是扫描仪固件还是桌面软件。(在我看来,是扫描仪固件忽略了该项目,因为您在重置它时说它工作正常)

编辑:我还看到您正在基于DataREadyEvent读取串行端口,同样,如果是我,我会添加另一个延迟很短的线程,比如20ms或50ms,以持续读取串行端口。关于如何在网络上实现这一点,有很多示例,这里介绍了一种简单而快速的方法:


希望有帮助。

好的,我终于找到了十六进制代码,它实际上重置了传感器。 所以要帮助那些购买中档超高频RFID阅读器或任何型号的人

我们所做的是通过在数据引脚上焊接铜线来侵入串行端口的电线。然后我们将铜线的另一端连接到我的笔记本电脑上,并使用终端读取器“Putty”来查看电脑在重置头部按钮点击时实际发送给读取器的内容

通过这种方式,我们找到了十六进制代码,将其转换为字节数组,这是通过串行端口将其写入读卡器设备并重置设备的C#代码:

{ 
mySerialPort.Open();
        byte[] bytesToSend = StringToByteArray("A00265F9");// correct command to reset READER
        mySerialPort.Write(bytesToSend, 0, 4);
}
public static byte[] StringToByteArray(string hex)
        {
            return Enumerable.Range(0, hex.Length)
                             .Where(x => x % 2 == 0)
                             .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                             .ToArray();
        }

除了您订阅DataReceived事件之外,我没有看到任何突然出现的问题。我过去对此只有问题。基本上,当我从serialport读取时,我有一个线程,它只是_serialport.ReadByte()这样处理。我不知道这是否会对你有帮助,但值得一试。你是说即使你再扫描一次,你也不能再读取准确的字符串?或者你不能在给定的扫描中多次看到数据?你能告诉我们硬件传感器的具体细节吗?如果你把标签从传感器上移开,移动一个不同的标签进入范围是否传输标签代码?嗨,杰夫,传感器是一个简单的基于射频的标签读取器,如果我将标签移到它前面,它会返回一个代码,如果我将另一个标签移到它前面,它也会返回代码。但是如果我再次移动第一个标签,它不会读取它,除非我给传感器一个电源重置。嗨,Bobson,我无法读取相同的data两次。除非我重置传感器电源。