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