例如,下面的代碼使用SerialPort類向COM1端口中寫入數(shù)據(jù),并進(jìn)行異步讀取。
using System.IO.Ports;
using System.Threading;
//實(shí)例化串口對(duì)象(默認(rèn):COM1,9600,e,8,1)
SerialPort SPort = new SerialPort();
private void Form1_Load(object sender, EventArgs e)
{
//更改參數(shù)
SPort.PortName = "COM1";
SPort.BaudRate = 9600;
SPort.Parity = Parity.None;
SPort.DataBits = 8;
SPort.StopBits = StopBits.One;
SPort.ReadBufferSize = 4096;
}
//發(fā)送并接收串口信息
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("發(fā)送串口信息成功");
ReceiveData(SPort);
}
//異步讀取
private void AsyReceiveData(object serialPortobj)
{
SerialPort serialport = (SerialPort)serialPortobj;
System.Threading.Thread.Sleep(1000);
MessageBox.Show(serialport.ReadExisting());
serialport.Close();
}
//開啟接收數(shù)據(jù)線程
private void ReceiveData(SerialPort serialPort)
{
//異步接收數(shù)據(jù)線程
Thread threadReceiveSub = new Thread(new ParameterizedThreadStart(AsyReceiveData));
threadReceiveSub.Start(serialPort);
}
1.6.3 視頻監(jiān)控模塊實(shí)現(xiàn)過程
視頻監(jiān)控模塊的具體實(shí)現(xiàn)步驟如下:
(1)新建一個(gè)Windows窗體,命名為frmMain.cs,主要用于實(shí)現(xiàn)視頻監(jiān)控功能及各種監(jiān)控控制。該窗體用到的主要控件如表1.16所示。
(2)frmMain.cs代碼文件中,首先實(shí)例化公共類PelcoD和SoftReg的兩個(gè)對(duì)象,以便調(diào)用其中的方法,然后實(shí)例化一個(gè)SerialPort類對(duì)象,用來向云臺(tái)發(fā)送串口消息,聲明一個(gè)int類型的變量、兩個(gè)byte類型的變量和一個(gè)byte類型的數(shù)組,分別用來獲取視頻采集卡的路數(shù)、存儲(chǔ)Pelco-D協(xié)議中的地址碼、數(shù)據(jù)碼和要向云臺(tái)傳送的串口消息。關(guān)鍵代碼如下:
例程15 代碼位置:光盤\TM\01\VWMS\VWMS\frmMain.cs
PelcoD pelcod = new PelcoD();
SoftReg softreg = new SoftReg();
SerialPort serialPort = new SerialPort("COM1", 2400, Parity.None, 8); //實(shí)例化串口信息類,指定串口號(hào)
int m_dwDevNum = 0; //存儲(chǔ)視頻路數(shù)
byte addressin = Byte.Parse(Convert.ToString(0x01)); //Pelco-D協(xié)議中的第一地址碼
byte speedin = Byte.Parse(Convert.ToString(0xff)); //Pelco-D協(xié)議中的第二地址碼
byte[] messagesend; //存儲(chǔ)要發(fā)送的串口消息
frmMain.cs代碼文件中,自定義了兩個(gè)方法startMonitor()和stopMove()。其中,startMonitor()方法用來實(shí)現(xiàn)開始監(jiān)控功能,其實(shí)現(xiàn)代碼如下:
例程16 代碼位置:光盤\TM\01\VWMS\VWMS\frmMain.cs
//開始監(jiān)控
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卡驅(qū)動(dòng)程序沒有安裝");
}
else
{
for (int i = 0; i < m_dwDevNum; i++)
{
v VideoOperate.VCAOpenDevice(i, plVideo1.Handle);
w VideoOperate.VCAStartVideoPreview(i);
}
}
}
}
U 代碼貼士
u VCAGetDevNum():該方法用來返回系統(tǒng)中卡號(hào)數(shù)量,即為SAA7134硬件數(shù)目。
v VCAOpenDevice():該方法用來打開指定卡號(hào)的設(shè)備,并分配相應(yīng)的系統(tǒng)資源。
w VCAStartVideoPreview():該方法用來開始視頻預(yù)覽。
stopMove()方法用來實(shí)現(xiàn)停止移動(dòng)視頻監(jiān)控畫面功能,其實(shí)現(xiàn)代碼如下:
例程17 代碼位置:光盤\TM\01\VWMS\VWMS\frmMain.cs
//停止移動(dòng)
protected void stopMove()
{
messagesend = pelcod.CameraStop(addressin);
u serialPort.Open();
v serialPort.Write(messagesend, 0, 7);
w serialPort.Close();
}
U 代碼貼士
u Open():該方法用來打開一個(gè)新的串行端口連接。
v Write():該方法用來將數(shù)據(jù)寫入串行端口輸出緩沖區(qū)。
w Close():該方法用來關(guān)閉端口連接。
frmMain窗體在加載時(shí),首先從注冊(cè)表中提取注冊(cè)信息,以判斷該軟件是否注冊(cè),如果已經(jīng)注冊(cè),則在窗體標(biāo)題欄中顯示“已注冊(cè)”字樣,同時(shí)開始視頻監(jiān)控;否則,在窗體標(biāo)題欄中顯示“未注冊(cè)”字樣,并提示用戶已試用次數(shù)。frmMain窗體的Load事件的代碼如下:
例程18 代碼位置:光盤\TM\01\VWMS\VWMS\frmMain.cs
//窗體加載時(shí),初始化視頻卡,并開始預(yù)覽視頻
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()) //判斷是否注冊(cè)
{
if (strRNum == softreg.getRNum())
{
this.Text = "家庭視頻監(jiān)控系統(tǒng)(已注冊(cè))";
btnReg.Enabled = false;
startMonitor();
return;
}
}
this.Text = "家庭視頻監(jiān)控系統(tǒng)(未注冊(cè))";
btnReg.Enabled = true;
btnSetMonitor.Enabled = btnAutoMonitor.Enabled = false;
startMonitor();
MessageBox.Show("您現(xiàn)在使用的是試用版,該軟件可以免費(fèi)試用30次!","提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
Int32 tLong;
try
{
//獲取注冊(cè)表值
tLong = (Int32)Registry.GetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\angel", "UseTimes", 0);
MessageBox.Show("感謝您已使用了" + tLong + "次", "提示", MessageBoxButtons.OK, MessageBoxIcon. Information);
}
catch
{
//寫入注冊(cè)表信息
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;
//將軟件使用次數(shù)寫入注冊(cè)表
Registry.SetValue("HKEY_LOCAL_MACHINE\\SOFTWARE\\angel", "UseTimes", Times);
}
else
{
MessageBox.Show("試用次數(shù)已到", "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning);
Application.Exit();
}
}