[DllImport(
"
KMY350X.dll
")]
private
static
extern
int OpenPort(
int PortNum,
int BaudRate);
如果一些厂家比较懒的话,没有提供相应的dll,我们只能对它进行串口通信编程了。以前从没接触过串口编程,最近在一个项目中有几个地方都需要采用串口通信,跟公司一个老手请教后,感觉学到了很多东西,特在此做个总结:
ConfigClass config =
new ConfigClass();
comm.serialPort.PortName = config.ReadConfig(
"
SendHealCard
");
//
波特率
comm.serialPort.BaudRate =
9600;
//
数据位
comm.serialPort.DataBits =
8;
//
两个停止位
comm.serialPort.StopBits = System.IO.Ports.StopBits.One;
//
无奇偶校验位
comm.serialPort.Parity = System.IO.Ports.Parity.None;
comm.serialPort.ReadTimeout =
100;
comm.serialPort.WriteTimeout = -
1;
public class Comm
{
public
delegate
void EventHandle(
byte[] readBuffer);
public
event EventHandle DataReceived;
public SerialPort serialPort;
Thread thread;
volatile
bool _keepReading;
public Comm()
{
serialPort =
new SerialPort();
thread =
null;
_keepReading =
false;
}
public
bool IsOpen
{
get
{
return serialPort.IsOpen;
}
}
private
void StartReading()
{
if (!_keepReading)
{
_keepReading =
true;
thread =
new Thread(
new ThreadStart(ReadPort));
thread.Start();
}
}
private
void StopReading()
{
if (_keepReading)
{
_keepReading =
false;
thread.Join();
thread =
null;
}
}
private
void ReadPort()
{
while (_keepReading)
{
if (serialPort.IsOpen)
{
int count = serialPort.BytesToRead;
if (count >
0)
{
byte[] readBuffer =
new
byte[count];
try
{
Application.DoEvents();
serialPort.Read(readBuffer,
0, count);
if(DataReceived !=
null)
DataReceived(readBuffer);
Thread.Sleep(
100);
}
catch (TimeoutException)
{
}
}
}
}
}
public
void Open()
{
Close();
serialPort.Open();
if (serialPort.IsOpen)
{
StartReading();
}
else
{
MessageBox.Show(
"
串口打开失败!
");
}
}
public
void Close()
{
StopReading();
serialPort.Close();
}
public
void WritePort(
byte[] send,
int offSet,
int count)
{
if (IsOpen)
{
serialPort.Write(send, offSet, count);
}
}
}
Comm
comm = new Comm();
ConfigClass config =
new ConfigClass();
comm.serialPort.PortName = config.ReadConfig(
"
SendHealCard
");
//
波特率
comm.serialPort.BaudRate =
9600;
//
数据位
comm.serialPort.DataBits =
8;
//
两个停止位
comm.serialPort.StopBits = System.IO.Ports.StopBits.One;
//
无奇偶校验位
comm.serialPort.Parity = System.IO.Ports.Parity.None;
comm.serialPort.ReadTimeout =
100;
comm.serialPort.WriteTimeout = -1;
comm.Open();
if (comm.IsOpen)
{
comm.DataReceived += new Comm.EventHandle(comm_DataReceived);
}
///
<summary>
///
发卡到机口
///
</summary>
private
void SendCardToOut()
{
is_read_card =
false;
sendCardToOut =
true;
byte[] send = {
0x02,
0x46,
0x43,
0x34,
0x03,
0x30 };
if (comm.IsOpen)
{
comm.WritePort(send,
0, send.Length);
}
}
void comm_DataReceived(byte[] readBuffer1)
{
//
log.Info(HexCon.ByteToString(readBuffer));
if (readBuffer1.Length ==
1)
{
receive = HealCardClass.ByteToString(readBuffer1);
string str =
"
06
";
if (
string.Equals(receive.Trim(), str, StringComparison.CurrentCultureIgnoreCase))
{
try
{
if (is_read_card)
{
byte[] send =
new
byte[
1];
send[
0] =
0x05;
comm.WritePort(send,
0, send.Length);
Thread.Sleep(
500);
comm.DataReceived -=
new Comm.EventHandle(comm_DataReceived);
InitReadComm();
}
if (sendCardToOut)
{
byte[] send =
new
byte[
1];
send[
0] =
0x05;
comm.WritePort(send,
0, send.Length);
readComm.DataReceived -=
new Comm.EventHandle(readComm_DataReceived);
readComm.Close();
log.Info(
"
发卡完成!
");
lblMsg.Text =
"
发卡成功!
";
lblSendCardMsg.Text =
"
发卡完成,请收好卡!
";
timer1.Tick -=
new EventHandler(timer1_Tick);
PlaySound();
this.btnOK.Enabled =
true;
}
}
catch (Exception ex)
{
log.Info(ex.ToString());
}
}
}
}