bism4读写头

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
using System;
using System.IO.Ports;

namespace
{

/// Balluff BIS M-4 RFID 读写头
/// 通过串口控制
/// </summary>
public class BISM4
{
private SerialPort SP;

public BISM4(SerialPort sp)
{
SP = sp;
//设置每行结尾为回车符 CR 13(Decimal) OD(HEX)
SP.NewLine = "r";
}

public static readonly string STX = "u0002";
public static readonly string ACK0 = "u00060";
public static readonly string LPEnd = "11";

~BISM4()
{
try
{
SP.Close();
}catch(Exception ex)
{
Console.WriteLine("~BISM4" + ex.ToString());
}
}

private object sendLock = new object();

/// 发送
/// </summary>
/// <param name="s"></param>
public void Send(string s)
{
try
{
lock (sendLock)
{
if (!SP.IsOpen)
{
SP.Open();
}
SP.WriteLine(s);
}
}catch(Exception ex)
{
Console.WriteLine("Send" + ex.ToString());
}
}

public string Read(int count = 0)
{
lock (sendLock)
{
string s = "";
while(s == "")
{
if (count == 0)
{
s = SP.ReadLine();
}
else
{
char[] ca = new char[count];
int rc = SP.Read(ca, 0, count);
s = new string(ca);
}
}
return s;
}
}


/// 读取存储器序列号
/// </summary>
public string U()
{
string s = "U";
Send(s);
string ur = Read();
return ur;
}


/// P
/// 写入数据
/// </summary>
/// <param name="address">地址</param>
/// <param name="count">字节数</param>
/// <param name="value">数据</param>
public void P(int address,int count,string value)
{
string s = "P" + address.ToString("D4") + count.ToString("D4") + LPEnd;
string STXString = STX + value;
Send(s);
string lr = Read();
if(lr == ACK0)
{
Send(STXString);
}
else
{

}
lr = Read();
}


/// L
/// 读取数据
/// </summary>
/// <param name="address">地址</param>
/// <param name="count">字节数</param>
/// <returns>数据</returns>
public string L(int address,int count)
{
if(count <= 0) {
return "";
}
string s = "L" + address.ToString("D4") + count.ToString("D4") + LPEnd;
string STXString = STX;
Send(s);
string lr = Read();
if(lr == ACK0)
{
Send(STXString);
string lr2 = Read(0);
return lr2;
}
else
{
return "Error";
}
}
}
}