例如,下面的代码使用SerialPort类向COM1端口中写入数据,并进行异步读取。
using System.IO.Ports;
using System.Threading;
//实例化串口对象(默认:COM1,9600,e,8,1)
SerialPort SPort = new SerialPort();
private void Form1_Load(object sender, EventArgs e)
{
//更改参数
SPort.PortName = "COM1";
SPort.BaudRate = 9600;
SPort.Parity = Parity.None;
SPort.DataBits = 8;
SPort.StopBits = StopBits.One;
SPort.ReadBufferSize = 4096;
}
//发送并接收串口信息
private void button1_Click(object sender, EventArgs e)
{
//打开串口
if (SPort.IsOpen == false)
{
SPort.Open();
}
byte[] bytesSend = System.Text.Encoding.Default.GetBytes(richTextBox1.Text);
SPort.Write(bytesSend, 0, bytesSend.Length);
MessageBox.Show("发送串口信息成功");
ReceiveData(SPort);
}
//异步读取
private void AsyReceiveData(object serialPortobj)
{
SerialPort serialport = (SerialPort)serialPortobj;
System.Threading.Thread.Sleep(1000);
MessageBox.Show(serialport.ReadExisting());
serialport.Close();
}
//开启接收数据线程
private void ReceiveData(SerialPort serialPort)
{
//异步接收数据线程
Thread threadReceiveSub = new Thread(new ParameterizedThreadStart(AsyReceiveData));
threadReceiveSub.Start(serialPort);
}
1.6.3 视频监控模块实现过程
视频监控模块的具体实现步骤如下:
(1)新建一个Windows窗体,命名为frmMain.cs,主要用于实现视频监控功能及各种监控控制。该窗体用到的主要控件如表1.16所示。
(2)frmMain.cs代码文件中,首先实例化公共类PelcoD和SoftReg的两个对象,以便调用其中的方法,然后实例化一个SerialPort类对象,用来向云台发送串口消息,声明一个int类型的变量、两个byte类型的变量和一个byte类型的数组,分别用来获取视频采集卡的路数、存储Pelco-D协议中的地址码、数据码和要向云台传送的串口消息。关键代码如下:
例程15 代码位置:光盘\TM\01\VWMS\VWMS\frmMain.cs
PelcoD pelcod = new PelcoD();
SoftReg softreg = new SoftReg();
SerialPort serialPort = new SerialPort("COM1", 2400, Parity.None, 8); //实例化串口信息类,指定串口号
int m_dwDevNum = 0; //存储视频路数
byte addressin = Byte.Parse(Convert.ToString(0x01)); //Pelco-D协议中的第一地址码
byte speedin = Byte.Parse(Convert.ToString(0xff)); //Pelco-D协议中的第二地址码
byte[] messagesend; //存储要发送的串口消息
frmMain.cs代码文件中,自定义了两个方法startMonitor()和stopMove()。其中,startMonitor()方法用来实现开始监控功能,其实现代码如下:
例程16 代码位置:光盘\TM\01\VWMS\VWMS\frmMain.cs
//开始监控
protected void startMonitor()
{
if (VideoOperate.VCAInitSdk(this.Handle, VideoOperate.DISPLAYTRANSTYPE.PCI_MEMORY_VIDEOMEMORY, false))
{
u m_dwDevNum = VideoOperate.VCAGetDevNum();
if (m_dwDevNum == 0)
{
MessageBox.Show("VC404卡驱动程序没有安装");
}
else
{
for (int i = 0; i < m_dwDevNum; i++)
{
v VideoOperate.VCAOpenDevice(i, plVideo1.Handle);
w VideoOperate.VCAStartVideoPreview(i);
}
}
}
}
U 代码贴士
u VCAGetDevNum():该方法用来返回系统中卡号数量,即为SAA7134硬件数目。
v VCAOpenDevice():该方法用来打开指定卡号的设备,并分配相应的系统资源。
w VCAStartVideoPreview():该方法用来开始视频预览。
stopMove()方法用来实现停止移动视频监控画面功能,其实现代码如下:
例程17 代码位置:光盘\TM\01\VWMS\VWMS\frmMain.cs
//停止移动
protected void stopMove()
{
messagesend = pelcod.CameraStop(addressin);
u serialPort.Open();
v serialPort.Write(messagesend, 0, 7);
w serialPort.Close();
}
U 代码贴士
u Open():该方法用来打开一个新的串行端口连接。
v Write():该方法用来将数据写入串行端口输出缓冲区。
w Close():该方法用来关闭端口连接。
frmMain窗体在加载时,首先从注册表中提取注册信息,以判断该软件是否注册,如果已经注册,则在窗体标题栏中显示“已注册”字样,同时开始视频监控;否则,在窗体标题栏中显示“未注册”字样,并提示用户已试用次数。frmMain窗体的Load事件的代码如下:
例程18 代码位置:光盘\TM\01\VWMS\VWMS\frmMain.cs
//窗体加载时,初始化视频卡,并开始预览视频
private void frmMain_Load(object sender, EventArgs e)
{
RegistryKey retkey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("software", true).CreateSubKey ("wxk").CreateSubKey("wxk.INI");
foreach (string strRNum in retkey.GetSubKeyNames()) //判断是否注册
{
if (strRNum == softreg.getRNum())
{
this.Text = "家庭视频监控系统(已注册)";
btnReg.Enabled = false;
startMonitor();
return;
}
}
this.Text = "家庭视频监控系统(未注册)";
btnReg.Enabled = true;
btnSetMonitor.Enabled = btnAutoMonitor.Enabled = false;
startMonitor();
MessageBox.Show("您现在使用的是试用版,该软件可以免费试用30次!","提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
Int32 tLong;
try
{
//获取注册表值
tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\angel", "UseTimes", 0);
MessageBox.Show("感谢您已使用了" + tLong + "次", "提示", MessageBoxButtons.OK, MessageBoxIcon. Information);
}
catch
{
//写入注册表信息
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\angel", "UseTimes", 0, RegistryValueKind. DWord);
MessageBox.Show("欢迎新用户使用本软件", "提示", MessageBoxButtons.OK, MessageBoxIcon. Information);
}
tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\angel", "UseTimes", 0);
if (tLong < 30)
{
int Times = tLong + 1;
//将软件使用次数写入注册表
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\angel", "UseTimes", Times);
}
else
{
MessageBox.Show("试用次数已到", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
Application.Exit();
}
}