private void Button_Click_14(object sender, RoutedEventArgs e)
{
try
{
if (!serialport1.IsOpen)
{
openclose.Content = "允许读卡器通信";
}
else
{
serialport1.Close();
openclose.Content = "禁止读卡器通信";
return;
}
serialport1.PortName = "COM1";
serialport1.BaudRate = 9600;
serialport1.Parity = Parity.None;
serialport1.StopBits = StopBits.One;
serialport1.Open();
serialport1.ReceivedBytesThreshold = 4;
serialport1.DataReceived += new SerialDataReceivedEventHandler(serialport1_DataReceived);
//flag = true;
}
catch
{
MessageBox.Show("打开串口失败,请重试!");
//处理超时错误
}
}
public void serialport1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort Port = (SerialPort)sender;
int SeriaDataLength = Port.BytesToRead; //得到缓冲区数据长度
byte[] SeriaData = new byte[SeriaDataLength]; //设置数组
Port.Read(SeriaData, 0, SeriaDataLength); //读取缓冲区
interfaceUpdateHandle = new HandleInterfaceUpdateDelagate(UpdateTextBox);//实例化委托对象
Dispatcher.Invoke(interfaceUpdateHandle, new string[] { Encoding.ASCII.GetString(SeriaData) });
}
private void UpdateTextBox(string text)
{
////////////////////////////////////////////////////////////////////////
//<协议解析>
List<string> buf = new List<string>(text.Length);//声明一个临时数组存储当前来的串口数据
MessageBox.Show(text.Length.ToString());
MessageBox.Show(text);
for (int i = 0; i < text.Length / 2; i++)
{
buf.Add(text.Substring(i * 2, 2));
}
while (text.Length >= 5) //至少要包含头(2字节)+命令(1字节)+数据长度(1字节)+校验(1字节)
{
if (buf[0] == "aa" && buf[1] == "01")
{
if (buf[2] == "01")//归还设备
{
string device = text.Substring(6, 8);
sqlHelper.comreturn(device);
MessageBox.Show("设备已归还");
}
else if (buf[2] == "02")
{
string device = text.Substring(6, 8);
}
}
else
{
buf.RemoveAt(0);
}
}