RS-232C 控制 PTZ 攝影機 |
缺席
|
炎峰
一般會員 發表:7 回覆:9 積分:3 註冊:2011-03-16 發送簡訊給我 |
各位大大好 ~
小弟我使用 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 發送簡訊給我 |
小弟今天發現 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 發送簡訊給我 |
不好意思...
小弟後來發現直接傳入 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, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |