[DllImport(
"
KMY350X.dll
")]
private
static
extern
int OpenPort(
int PortNum,
int BaudRate);
若是一些廠家比較懶的話,沒有提供相應的dll,咱們只能對它進行串口通訊編程了。之前從沒接觸過串口編程,最近在一個項目中有幾個地方都須要採用串口通訊,跟公司一個老手請教後,感受學到了不少東西,特在此作個總結:html
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());
}
}
}
}