📄 unit1.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
HANDLE hComm=INVALID_HANDLE_VALUE;
//设置SONY遥控命令
BYTE STOP[]={0x020,0x000,0x020};
BYTE PLAY[]={0x020,0x001,0x021};
BYTE REC[]={0x020,0x002,0x022};
BYTE STDBY[]={0x020,0x004,0x024};
BYTE EJECT[]={0x020,0x00f,0x02f};
BYTE FF[]={0x020,0x010,0x030};
BYTE REW[]={0x020,0x020,0x040};
BYTE STILL[]={0x020,0x005,0x025};
BYTE GetCurrectCTL[]={0x061,0x00c,0x004,0x071};
BYTE GetCurrectTC[]={0x061,0x0c,0x001,0x06e};
BYTE CurrentStatus[]={0x061,0x020,0x007,0x088};
BYTE REW48X[]={0x021,0x023,0x076,0x0BA};
BYTE REW25X[]={0x021,0x023,0x06c,0x0B0};
BYTE REW16X[]={0x021,0x023,0x066,0x0AA};
BYTE REW9X[]={0x021,0x023,0x05E,0x0A2};
BYTE REW4X[]={0x021,0x023,0x053,0x097};
BYTE REW1X[]={0x021,0x023,0x040,0x084};
BYTE FF48X[]={0x021,0x013,0x076,0x0AA};
BYTE FF25X[]={0x021,0x013,0x06c,0x0A0};
BYTE FF16X[]={0x021,0x013,0x066,0x09A};
BYTE FF9X[]={0x021,0x013,0x05E,0x092};
BYTE FF4X[]={0x021,0x013,0x053,0x087};
BYTE FF1X[]={0x021,0x013,0x040,0x074};
BYTE jREW_1X[]={0x021,0x021,0x020,0x062};
BYTE jREW_3X[]={0x021,0x021,0x02f,0x071};
BYTE jREW_5X[]={0x021,0x021,0x036,0x076};
BYTE jREW_8X[]={0x021,0x021,0x03c,0x07e};
BYTE jREW1X[]={0x021,0x021,0x040,0x082};
BYTE jFF_1X[]={0x021,0x011,0x020,0x052};
BYTE jFF_3X[]={0x021,0x011,0x02f,0x061};
BYTE jFF_5X[]={0x021,0x011,0x036,0x066};
BYTE jFF_8X[]={0x021,0x011,0x03c,0x06e};
BYTE jFF1X[]={0x021,0x011,0x040,0x072};
BYTE Mask[]={0x03f,0x07f,0x07f,0x03f};
BYTE temp[64];
int i=0;
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
DCB dcbCommPort;
//打开串行口com1
hComm=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,
0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,
NULL);
if(hComm==INVALID_HANDLE_VALUE)
Application->Terminate();
//取得当前串行口参数
GetCommState(hComm,&dcbCommPort);
//设置SONY设备使用的串行口参数
dcbCommPort.BaudRate=(UINT)CBR_38400;//波特率38400
dcbCommPort.Parity=(BYTE)ODDPARITY; //奇校验
dcbCommPort.StopBits=(BYTE)ONESTOPBIT;//一个停止位
dcbCommPort.ByteSize=(BYTE)8; //数据位8bit
dcbCommPort.fBinary=1; //二进制数据收发
SetCommState(hComm,&dcbCommPort);
//读取录像机当前时码
if(RadioCTL->Checked==FALSE)
SentComm(GetCurrectTC);
else
SentComm(GetCurrectCTL);
for(i=0;i<500;i++)
ReceiveSony();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
//关闭串行口
CloseHandle(hComm);
hComm=INVALID_HANDLE_VALUE;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SentComm(BYTE *comm)
{
BOOL n=FALSE;
DWORD ReturnedByteCount;
//清除串行口输入、输出缓冲区中的内容
PurgeComm(hComm,PURGE_TXABORT|PURGE_RXABORT|
PURGE_TXCLEAR|PURGE_RXCLEAR);
//发送命令
n=WriteFile(hComm,(void *)comm,(*comm&0x0f)+3,&ReturnedByteCount,NULL);
if(n==FALSE)
{
MessageBox(NULL,"控制命令发送失败!!","警告",MB_OK);
return;
}
}
void __fastcall TForm1::rewClick(TObject *Sender)
{
TrackBar1->Position=0;
SentComm(REW);
Timer1->Enabled = True;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::playClick(TObject *Sender)
{
TrackBar1->Position=6;
SentComm(PLAY);
Timer1->Enabled =True;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::stillClick(TObject *Sender)
{
SentComm(STOP);
SentComm(STILL);
TrackBar1->Position=6;
Timer1->Enabled =False;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ffClick(TObject *Sender)
{
TrackBar1->Position=12;
SentComm(FF);
Timer1->Enabled =True;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ejectClick(TObject *Sender)
{
SentComm(EJECT);
Timer1->Enabled =False;
if(RadioCTL->Checked==True)
Label1->Caption="00:00:00:00";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::recClick(TObject *Sender)
{
SentComm(REC);
Timer1->Enabled =True;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::stdbyClick(TObject *Sender)
{
SentComm(STDBY);
Timer1->Enabled =False;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::stopClick(TObject *Sender)
{
SentComm(STOP);
TrackBar1->Position=6;
Timer1->Enabled =False;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioCTLClick(TObject *Sender)
{
RadioTC->Checked=FALSE;
SentComm(GetCurrectCTL);
for(i=0;i<500;i++)
ReceiveSony();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RadioTCClick(TObject *Sender)
{
RadioCTL->Checked=FALSE;
SentComm(GetCurrectTC);
for(i=0;i<500;i++)
ReceiveSony();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ReceiveSony()
{
COMSTAT comstat;
DWORD Error;
DWORD nToRead=0;
BOOL n;
DWORD ReturnedByteCount;
BYTE chksum;
// 串行口是否出错
ClearCommError(hComm,&Error,&comstat);
if(Error)
return;
if(comstat.cbInQue > (DWORD)sizeof(temp))
nToRead=sizeof(temp);
else
nToRead=comstat.cbInQue;
if(nToRead==0)
return;
n=ReadFile(hComm,(void *)temp,nToRead,
&ReturnedByteCount,NULL);
if(n==FALSE)
return;
/* //检查校验和
for(i=1,chksum=temp[0];i<((temp[0]&0x0f)+2);i++)
chksum+=temp[i];
if(temp[i]!=chksum)
{
MessageBox(NULL,"校验和错","警告",MB_OK);
return;
}
//return NAK
if((*temp==0x011)&&(*(temp+1)==0x012))
{
MessageBox(NULL,"没有此命令或电缆联接异常","警告",MB_OK);
return;
}
if((*temp==0x074)&&(*(temp+1)==0x020))
{
if(*(temp+2)&&0x01==1)
MessageBox(NULL,"请将录像机置于Remote状态!","信息",MB_OK);
} */
//接收的如果是时码
if(*temp==0x074)
DisplayTime();
}
//---------------------------------------------------------
void __fastcall TForm1::DisplayTime()
{
char Display[64];
wsprintf(Display,"%2.2x:%2.2x:%2.2x:%2.2x",
temp[5]&Mask[3],
temp[4]&Mask[2],
temp[3]&Mask[1],
temp[2]&Mask[0]);
Label1->Caption=Display;
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(RadioCTL->Checked==FALSE)
SentComm(GetCurrectTC);
else
SentComm(GetCurrectCTL);
for(i=0;i<500;i++)
ReceiveSony();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
SentComm(STILL);
if(JOG->Checked==True) //Jog方式
{ switch(TrackBar1->Position)
{
case 0:
SentComm(jREW1X);
break;
case 1:
SentComm(jREW1X);
break;
case 2:
SentComm(jREW_8X);
break;
case 3:
SentComm(jREW_5X);
break;
case 4:
SentComm(jREW_3X);
break;
case 5:
SentComm(jREW_1X);
break;
case 6:
SentComm(STOP);
Timer1->Enabled=False;
break;
case 7:
SentComm(jFF_1X);
break;
case 8:
SentComm(jFF_3X);
break;
case 9:
SentComm(jFF_5X);
break;
case 10:
SentComm(jFF_8X);
break;
case 11:
SentComm(jFF1X);
break;
case 12:
SentComm(jFF1X);
default:
break;
}
Timer1->Enabled=True;
return;
}
switch(TrackBar1->Position) //Shuttel
{
case 0:
SentComm(REW48X);
break;
case 1:
SentComm(REW25X);
break;
case 2:
SentComm(REW16X);
break;
case 3:
SentComm(REW9X);
break;
case 4:
SentComm(REW4X);
break;
case 5:
SentComm(REW1X);
break;
case 6:
SentComm(STOP);
Timer1->Enabled=False;
break;
case 7:
SentComm(FF1X);
break;
case 8:
SentComm(FF4X);
break;
case 9:
SentComm(FF9X);
break;
case 10:
SentComm(FF16X);
break;
case 11:
SentComm(FF25X);
break;
case 12:
SentComm(FF48X);
default:
break;
}
Timer1->Enabled=True;
return;
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -