|
시리얼 데이터가 전송이 되야 다음 것을 진행을 하는데...어제부터 이건만 잡고 있네요..-.-
제가 질문 드리는 요지는 간단 합니다. 바로 Edit5->Text를 char형을 바꾸어야 한다는 거죠.
일단 제가 첨 질문 했을 때와는 좀 다르게 소스를 짰습니다.
어느정도 결론이 나온 것 같은데, 한가지 문제가 있더라구요.딱 한가지...........
아래에 보시면 2 구문이 있죠.
..... TotalData[2]=TotalData[2] & ~(Edit5->Text<<1);
..... TotalData[2]=TotalData[2] | (Edit5->Text<<0);
위에 것은 if에 있는 것이고 아래것은 else문에 있는 겁니다.
문제는 else문에 있는 것은 에러가 안 나죠.
if문에 있는 구문이 에러가 나는데 이유는
~(Edit5->Text<<1);에서 ~연산자 때문이죠.(AnsiString형 이기 때문에........-.---)
근데 이걸 써야 하거든요.
이 상태에서 Edit5->Text를 char형으로 바꾸었죠.이렇게요...(char)Edit5->Text.c_str()
근데 이렇게 하고 실행하면 결과 같이 이상하게 나와요.
어느 장단에 맞춰야 할지........-.-
(char)Edit5->Text.c_str()이것이 char형이 아닌가요?
이것만 char형으로 바로 잡으면 될 것 같은데요...
아침에 알려주신 방법은 좀 문제가 있는게...
..... TotalData[2]=TotalData[2] & ~(Edit5->Text<<1);
이 구문이 2번째 비트와 3번째 비트를 차지해서 0부터 4에 의해서 값이 0000 0000에서부터
0000 0110까지 변한다는 거죠.그래서 알려주신 방법은 쓸수가 없더군요.
같은 구문이 있는데, 여기서 한가지 문제가 있죠.
바로 Edit5->Text를 char형으로 바꿔야 하는거죠.
위에 대로 하면 에러가 납니다.
그리고
void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button)
{
static char TotalData[3];//={0,0,0};//,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
// char cBaseData=Edit5->Text;
Table1->Edit();
if(Table1->TableName=="fix.db")
{
if(strchr(Table1->FieldByName("50")->AsString.c_str(),'&'))
{
if(UpDown1->Position >= ( pow(2,StrToInt(Table1->FieldByName("Bit")->AsString))))
{
//ShowMessage("This is FF more value. ^.^");
Edit5->Text=0;
UpDown1->Position=0;
}
else
{
Edit5->Text=AnsiString::IntToHex(UpDown1->Position,1);
}
Table1->FieldByName("50")->AsString="&H"+Edit5->Text;
}
else
{
if(UpDown1->Position >= ( pow(2,StrToInt(Table1->FieldByName("Bit")->AsString))))
{
Edit5->Text=0;//2^StrToInt(Table1->FieldByName("Bit")->AsString)-1;
UpDown1->Position=0;
if(Table1->FieldByName("Name")->AsString=="NTPAL")
TotalData[2]=TotalData[2] & ~(Edit5->Text<<0);
else if(Table1->FieldByName("Name")->AsString=="CCD")
TotalData[2]=TotalData[2] & ~(Edit5->Text<<1);
else if(Table1->FieldByName("Name")->AsString=="YDOUT")
TotalData[2]=TotalData[2] & ~(Edit5->Text<<3);
else if(Table1->FieldByName("Name")->AsString=="UVDOUT")
TotalData[2]=TotalData[2] & ~(Edit5->Text<<4);
else if(Table1->FieldByName("Name")->AsString=="REC601")
TotalData[2]=TotalData[2] & ~(Edit5->Text<<5);
else if(Table1->FieldByName("Name")->AsString=="DSYNC")
TotalData[2]=TotalData[2] & ~(Edit5->Text<<6);
else if(Table1->FieldByName("Name")->AsString=="SG135")
TotalData[2]=TotalData[2] & ~(Edit5->Text<<7);
}
else
{
Edit5->Text=UpDown1->Position;
if(Table1->FieldByName("Name")->AsString=="NTPAL")
TotalData[2]=TotalData[2] | (Edit5->Text<<0);
else if(Table1->FieldByName("Name")->AsString=="CCD")
TotalData[2]=TotalData[2] | (Edit5->Text<<1);
else if(Table1->FieldByName("Name")->AsString=="YDOUT")
TotalData[2]=TotalData[2] | (Edit5->Text<<3);
else if(Table1->FieldByName("Name")->AsString=="UVDOUT")
TotalData[2]=TotalData[2] | (Edit5->Text<<4);
else if(Table1->FieldByName("Name")->AsString=="REC601")
TotalData[2]=TotalData[2] | (Edit5->Text<<5);
else if(Table1->FieldByName("Name")->AsString=="DSYNC")
TotalData[2]=TotalData[2] | (Edit5->Text<<6);
else if(Table1->FieldByName("Name")->AsString=="SG135")
TotalData[2]=TotalData[2] | (Edit5->Text<<7);
}
Table1->FieldByName("50")->AsString=Edit5->Text;
}
}
.
.
.
생략...
TotalData[0]=16;
TotalData[1]=1;
for(int i=0;i<3;i++)
{
ComPort1->WriteStr(TotalData[i]);
}
//ComPort1->Close();
Table1->Post();
즐거운 하루 되세요..............................................................................
아리랑 님이 쓰신 글 :
: Test해 봤는데 AnsiString이 SHift되는게 이상하군요. 뭔가 모르는게 있었나 봅니다.
:
: 해결책은 Edit5->Text의 값을 char형또는 Int형으로 변환후 사용하세요.
:
: 주의해야 할것은 Edit5->Text값 자체를 shift할것인지, 아니면 Edit5->Text값의 숫자를 shift할것인지 나와있지 않은데요. 뭔이야기냐면 Edit5->Text값에 "1"이 들어가 있다면 1 << 7로 shift할것인지 아니면 49 << 7로 할것인지가 나와있지 않다는겁니다. 여기서 49는 "1"의 Ascii code값입니다.
: StrToInt(Edit5->Text)값은 1이 되고(Int형으로 변환), Edit5->Text[0]의 값은 49입니다.
: 그리고 char형을 << 7로 shift하면 하위 1비트만 남고 상위비트들은 모조리 잘려나간다는건 잘 아시죠?
: 어쨋건 Edit5->Text에 "1"을 집어넣고 shift하니까 << 6 까지는 '1 << 숫자' 형태로 변환되더군요.
:
: 아래 수정문의 예는 char형으로 변환한것입니다.
:
: heartsim 님이 쓰신 글 :
: : 안녕하세요.빌더 초보입니다.
: : 비트 시프트 연산과 관련해 질문이 있어서요.^^
: : 먼저 관련 소스입니다.
: :
: : char TotalData[3]={0,0,0};
: char cBaseData = Edit5->Text[1]; // <== char형으로 변환.
: :
: : TotalData[0]=16;
: : TotalData[1]=1;
: :
: : if(Table1->FieldByName("Name")->AsString=="NTPAL")
: : TotalData[2]=TotalData[2] | Edit5->Text;
: : else if(Table1->FieldByName("Name")->AsString=="CCD")
: TotalData[2]=TotalData[2] | cBaseData << 1 ; // <== 아래도 이렇게 수정
: : TotalData[2]=TotalData[2] | Edit5->Text<<1;
: : else if(Table1->FieldByName("Name")->AsString=="YDOUT")
: : TotalData[2]=TotalData[2] | Edit5->Text<<2;
: : else if(Table1->FieldByName("Name")->AsString=="UVDOUT")
: : TotalData[2]=TotalData[2] | Edit5->Text<<4;
: : else if(Table1->FieldByName("Name")->AsString=="REC601")
: : TotalData[2]=TotalData[2] | Edit5->Text<<5;
: : else if(Table1->FieldByName("Name")->AsString=="DSYNC")
: : TotalData[2]=TotalData[2] | Edit5->Text<<6;
: : else if(Table1->FieldByName("Name")->AsString=="SG135")
: : TotalData[2]=TotalData[2] | Edit5->Text<<7;
: :
: : for(int i=0;i<3;i++)
: : {
: : ComPort1->WriteStr(TotalData[i]);
: : }
: :
: : 위와 같습니다.
: : 일단 시프트는 <<(왼쪽으로) 이동하는게 맞는 것 같은데요...
: : 그리고 WriteStr을 전송할 때 TotalData를 AnsiString형이 아닌 char형으로 했습니다.
: : 여기까지는 프로그램이 돌아가는 것으로 봐서는 문제가 없는 듯........
: : 그런데...
: : 맨 끝에 Edit5->Text<<7로 했을 때, 1로 세팅을 하면 invalid라고 에러가 나더군요.
: : 물론 원인은 char형으로 해서인지 1xxx xxxx로 자리수를 넘어서서 그런 것 같습니다.
: : 일단은 int형이나 unsigned형으로 하고 시리얼 전송을 해보니 결과 값이 다르게
: : 나오더군요.
: : 해결책이 없을가요?
: : ^^
: :
: :
: : 즐거운 하루되세요.
: :
: :
: :
: :
: :
: :
: :
|