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

本文关键字:读取 数据 新设备 通信 何刷 | 更新日期: 2023-09-27 18:36:21

好的,所以我在串行通信设备的相同问题中被困了将近 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);
        }
    }

private void DataReceivedHandler(Object sender,SerialDataReceivedEventArgs e) {

        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);
        } 
    }

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

正如我从您的评论中了解到的那样,即使是随附的程序也不会连续两次读取相同的条形码。我说的对吗?

在我看来,"标签阅读器制造商"可能故意放置了这种机制,以防止用户在结账时错误地扫描了两次物品。 因为在移动东西时,相同的东西停留在扫描仪上或与扫描仪交叉几次的情况经常发生。

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

他们应该为您提供一本手册,其中包含您可以发送到设备的所有命令的列表,您可以使用此命令来构建系统。

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

编辑:我也看到您正在根据DataREadyEvent读取您的串行端口,再次,如果是我,我会添加另一个延迟很短的线程,例如20ms或50ms以保持不断读取串行端口。 关于如何在网络上实现这一点有很多例子,这里描述了一种简单快捷的方法:

在 c# 中使用线程读取 COM 端口

希望对您有所帮助。

好的,

所以我终于找到了十六进制代码,它实际上重置了传感器。因此,为了帮助任何购买中档UHF RFID阅读器或任何类型的此型号的人。

我们所做的是通过在数据引脚上焊接铜线来入侵串行端口的电线。然后,我们将这些铜线的另一端连接到我的笔记本电脑上,并使用终端阅读器"Putty"查看PC在单击RESET HEAD按钮时实际发送到阅读器的内容。

这样我们找到了十六进制代码,将其转换为字节数组,这是通过串口将其写入读取器设备并重置设备的 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();
        }