線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3360
推到 Plurk!
推到 Facebook!

RS-232C 控制 PTZ 攝影機

缺席
炎峰
一般會員


發表:7
回覆:9
積分:3
註冊:2011-03-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-05-05 22:59:35 IP:220.132.xxx.xxx 訂閱
各位大大好 ~
小弟我使用 C Builder XE 控制 Sony EVI-D70 PTZ 攝影機
影像部分是使用 VFW,然後在 Image 上顯示...
為了控制 PTZ 攝影機,我們有爬了一些文
有些大大使用

[code cpp]
#pragma link "Comm"
...
Comm1->WriteFile(...);
[/code]

這種都會 compiler 錯誤,推測可能沒有裝 TComm 等等元件 ~
因此我們轉用另一種方法: http://delphi.ktop.com.tw/board.php?cid=169&fid=999&tid=99442
我們將控制寫在一個新 Unit (*.cpp 與 *.h),寫完之後,開啟 port 會成功 (有加判斷) ...
但是一按下移動的按鈕,就會整台電腦死當 !!
偶爾會成功移動,但是按其他鈕還是整台死當 ...
以下是寫在 *.h 的宣告:

[code cpp]
HANDLE hComm;
COMMTIMEOUTS cto;
bool Success;
DCB dcb;
[/code]

以下是寫在 *.cpp 的...
開啟連接埠:

[code cpp]
// 開啟 COM1
bool comm_open(void)
{
hComm = CreateFile( "COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, NULL, NULL);

dcb.DCBlength = sizeof(DCB);

if(hComm == INVALID_HANDLE_VALUE)
{
ShowMessage("找不到該串列埠!");
//Application->Terminate();
return (false);
}

GetCommState (hComm, &dcb);
dcb.BaudRate = CBR_9600; //Baud Rate = 9600
dcb.ByteSize = 8;
dcb.Parity = 0; //NOPARITY
dcb.StopBits = 0; //ONESTOPBIT
Success = SetCommState(hComm,&dcb);

cto.ReadIntervalTimeout = 0;
cto.ReadTotalTimeoutMultiplier = 0;
cto.ReadTotalTimeoutConstant = 500;
cto.WriteTotalTimeoutMultiplier = 0;
cto.WriteTotalTimeoutConstant = 500;
SetCommTimeouts(hComm,&cto);

if (Success != 0)
return (true);
else
{
CloseHandle(hComm);
return (false);
}
}
[/code]

移動的副程式:

[code cpp]
/* 以下是往上移動 ~
使用 TransmitCommChar 的方法 ...
因有 TrackBar 可改變速度,所以有傳入 *speed
但是就算拿掉 speed 還是會死當 */

void cam_Up(char *speed)
{
TransmitCommChar(hComm, 0x81);
TransmitCommChar(hComm, 0x01);
TransmitCommChar(hComm, 0x06);
TransmitCommChar(hComm, 0x01);
TransmitCommChar(hComm, *speed);
TransmitCommChar(hComm, *speed);
TransmitCommChar(hComm, 0x03);
TransmitCommChar(hComm, 0x01);
TransmitCommChar(hComm, 0xff);
return;
}

/* 以下是往下移動 ~
使用 WriteFile 的方法 ...
如有錯誤會顯示錯誤代碼,但總過關,沒有顯示失敗
雖然不會死當,但是 PTZ 完全沒有反應
不知道是不是有那裡寫錯 */

void cam_Down(char *speed)
{
DWORD dwWritenSize = 0;
char dd[]={0x81,0x01,0x06,0x01,0x05,0x05,0x03,0x02,0xff};
bool bRet = WriteFile(hComm,dd,1,&dwWritenSize,NULL);

if (!bRet)
{
int ret=GetLastError();
ShowMessage(IntToStr(ret));
CloseHandle(hComm);
}
}
[/code]

呼叫移動並傳入速度的程式:

[code cpp]
int ss = ShiftSpeed->Position;
AnsiString yy = IntToHex(ss,2);
char *tt = yy.c_str();
cam_Up(tt);
[/code]

請大大們幫忙看看吧,不知道是不是犯了愚蠢的錯誤
WriteFile 那邊有傳過去,但是沒有動作...
不知道是不是那邊有設定錯誤?
爬過另一篇文章有提到可能要先傳一個 Command 通知機器要做控制...
但是沒有詳細提出是要傳哪種命令...
我在使用手冊找不到相關命令,不知是我眼花還是有其他地方要注意的
炎峰
一般會員


發表:7
回覆:9
積分:3
註冊:2011-03-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-05-06 15:22:27 IP:140.130.xxx.xxx 訂閱
小弟今天發現 WriteFile 改一下就可以動了 

[code cpp]
void cam_Down(char *speed)
{
DWORD dwWritenSize = 0;
char dd[]={0x81,0x01,0x06,0x01,0x05,0x05,0x03,0x02,0xff};
bool bRet = WriteFile(hComm,dd,9,&dwWritenSize,NULL);

if (!bRet)
{
int ret=GetLastError();
ShowMessage(IntToStr(ret));
CloseHandle(hComm);
}
}
[/code]

但是調速出不來
所以麻煩大大幫忙看看調速那邊要怎麼改呢?
有試著直接把 tt 顯示在 memo
顯示的數值是正確的...但是傳進去的值似乎不對
麻煩大大幫忙一下嚕

炎峰
一般會員


發表:7
回覆:9
積分:3
註冊:2011-03-16

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-05-10 20:40:18 IP:220.134.xxx.xxx 訂閱
不好意思...
小弟後來發現直接傳入 int 就可以動了


[code cpp]
void cam_Down(int speed)
{
DWORD dwWritenSize = 0;
char dd[]={0x81,0x01,0x06,0x01,speed,speed,0x03,0x02,0xff};
bool bRet = WriteFile(hComm,dd,9,&dwWritenSize,NULL);

if (!bRet)
{
int ret=GetLastError();
ShowMessage(IntToStr(ret));
CloseHandle(hComm);
}
}
[/code]

麻煩板主把這篇刪掉吧...打擾大家了~真是抱歉

編輯記錄
炎峰 重新編輯於 2011-05-10 06:40:58, 註解 無‧
系統時間:2024-03-28 22:10:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!