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);
}
}
正如我从您的评论中了解到的那样,即使是随附的程序也不会连续两次读取相同的条形码。我说的对吗?
在我看来,"标签阅读器制造商"可能故意放置了这种机制,以防止用户在结账时错误地扫描了两次物品。 因为在移动东西时,相同的东西停留在扫描仪上或与扫描仪交叉几次的情况经常发生。
除非您可以访问扫描仪固件并能够自己进行更改,否则我会说联系制造商。我会联系制造商并直接询问此事。应该有一个命令告诉扫描仪"退出锁定模式并再次重新开始扫描",以应对多次扫描同一物品的特殊情况(例如购买多个类似的东西)。
他们应该为您提供一本手册,其中包含您可以发送到设备的所有命令的列表,您可以使用此命令来构建系统。
还有一件事要尝试! 您可以使用"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();
}