0

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

无效关闭端口(){

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

    }

私人无效DataReceivedHandler(对象发送者,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);
        } 

    }
4

2 回答 2

1

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

在我看来,“标签阅读器制造商”似乎有意设置了该机制,以防止用户在结账时错误地扫描物品两次。因为它经常会在扫描仪上停留或在移动物体时与扫描仪交叉几次。

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

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

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

编辑:我也看到你正在基于 DataREadyEvent 读取你的串口,如果是我,我会添加另一个延迟很短的线程,比如 20 毫秒或 50 毫秒,以不断读取串口。网上有很多关于如何实现这一点的例子,这里描述了一种简单快捷的方法:

在 C# 中使用线程读取 com 端口

希望能帮助到你。

于 2013-10-24T19:15:18.963 回答
0

好的,所以我终于找到了实际重置传感器的十六进制代码。因此,为了帮助那些购买了中距离 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();
        }
于 2013-10-25T19:56:54.770 回答