자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Firemonkey 시리얼통신 델파이 -> 안드로이드 시리널통신 도와주세요
2017.09.22 16:02
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 바쁜 와중에도 답변을 주시는 분들께 감사 댓글 필수
-----------------------------------------------------------------------------------------------
델파이코드 송신
procedure TfrmSense.SendData(Cmd: Integer; Temp: Integer);
Var TR : Array[0..6] of Byte ;
strAnsiName : AnsiString;
strName : String;
begin
TR[0] := 1; // T_Pk[0] : SOH
TR[1] := StrToInt(EditID.Text); // T_Pk[1] : 레벨 번호
TR[2] := Cmd; // T_Pk[2] : 오일, 물, 온도
TR[3] := Temp; // T_Pk[3] : 온도 Flag
TR[4] := 0; // T_Pk[4]
TR[5] := 4; // T_Pk[5] : EOT
TR[6] := TR[1] xor TR[2] xor TR[3] xor TR[4] xor TR[5];
ComPort1.Write(TR, 7);
end;
델파이 수신
procedure TfrmSense.ComPort1RxChar(Sender: TObject; Count: Integer);
var
TempData : String;
ChkSum : Variant;
begin
Timer2.Enabled := False;
if ComPort1.InputCount = 7 then
begin
ComPort1.Read(R_PK, 7);
ComPort1.ClearBuffer(True, False); // Input 버퍼 clear - True
TempData := FormatFloat('00',Byte(R_PK[0])) +
FormatFloat('00',Byte(R_PK[1])) +
FormatFloat('00',Byte(R_PK[2])) +
FormatFloat('00',Byte(R_PK[3])) +
FormatFloat('00',Byte(R_PK[4])) +
FormatFloat('00',Byte(R_PK[5])) +
FormatFloat('00',Byte(R_PK[6]));
ChkSum := (Byte(R_PK[4]) * 256) + Byte(R_PK[3]);
end;
Timer1.Enabled := True;
end;
델파이 에서는 정상으로 송수신이 정상 입니다.
function ToByteArray(JavaArray: TJavaArray<Byte>): TArray<Byte>;
begin
SetLength(Result, JavaArray.Length);
Move(JavaArray.Data^, Result[0], Length(Result));
end;
function ToJavaByteArray(ByteArray: TArray<Byte>): TJavaArray<Byte>;
begin
Result := TJavaArray<Byte>.Create(Length(ByteArray));
Move(ByteArray[0], Result.Data^, Length(ByteArray));
end;
안드로이드 송신부
procedure TFormMain.ButtonWriteClick(Sender: TObject);
var
WD: TJavaArray<Byte>;
WriteLength: Integer;
T_Pk :TArray<byte>;
begin
Memo.Lines.Clear;
(*
SetLength(T_Pk , 7);
T_Pk[0] := 1; // T_Pk[0] : SOH
T_Pk[1] := 1 ; //StrToInt(EditID.Text); // T_Pk[1] : 레벨 번호
T_Pk[2] := 0; // T_Pk[2] : 오일, 물, 온도
T_Pk[3] := 0; // T_Pk[3] : 온도 Flag
T_Pk[4] := 0; // T_Pk[4]
T_Pk[5] := 4; // T_Pk[5] : EOT
T_Pk[6] := T_Pk[1] xor T_Pk[2] xor T_Pk[3] xor T_Pk[4] xor T_Pk[5];
*)
WD := TJavaArray<Byte>.Create(7);
WD.Items[0] := 1;
WD.Items[1] := 1;
WD.Items[2] := 0;
WD.Items[3] := 0;
WD.Items[4] := 0;
WD.Items[5] := 4;
WD.Items[6] := WD.Items[1] XOR WD.Items[2] XOR WD.Items[3] XOR WD.Items[4] XOR WD.Items[5] ;
// WriteData := ToJavaByteArray(TEncoding.UTF8.GetBytes('110004') );
WriteLength := Device.write(WD); //ToJavaByteArray(T_Pk)
Memo.Lines.Add('Write ' + IntToStr(WD.Items[0])+IntToStr(WD.Items[1])
+ IntToStr(WD.Items[2])+IntToStr(WD.Items[3])
+ IntToStr(WD.Items[4])+IntToStr(WD.Items[5])
+ IntToStr(WD.Items[6])+' '+IntToStr(WriteLength));
Memo.Lines.Add('Write ' + IntToStr(T_Pk[0])+IntToStr(T_Pk[1])
+ IntToStr(T_Pk[2])+IntToStr(T_Pk[3])
+ IntToStr(T_Pk[4])+IntToStr(T_Pk[5])
+ IntToStr(T_Pk[6])+' '+IntToStr(WriteLength));
WD.DisposeOf;
Sleep(500);
ButtonReadClick(Sender);
// Memo.Lines.Add('Write length: ' + IntToStr(WriteLength) );
end;
//안드로이드 수신부
procedure TFormMain.ButtonReadClick(Sender: TObject);
var
ReadData: TJavaArray<Byte>;
ReadLength,
ReadAvailable: Integer;
ResByte:TArray<byte>;
begin
ReadAvailable := Device.getQueueStatus;
Memo.Lines.Add('Read available: ' + IntToStr(ReadAvailable));
if ReadAvailable > 0 then
begin
SetLength( ResByte ,7);
ReadData := TJavaArray<Byte>.Create(ReadAvailable);
ReadLength := Device.read(ReadData);
ResByte := ToByteArray(ReadData);
Memo.Lines.Add('Read length: ' + IntToStr(ReadLength));
// Memo.Lines.Add('Read data: ' + TEncoding.UTF8.GetString(ToByteArray(ReadData)));
Memo.Lines.Add('Read data: ' +IntToStr(ResByte[0])+IntToStr(ResByte[1])
+ IntToStr(ResByte[2])+IntToStr(ResByte[3])
+ IntToStr(ResByte[4])+IntToStr(ResByte[5])
+ IntToStr(ResByte[6]));
end;
end;
적용을 어떻게 해야 되는 지 잘 모르겠습니다. 부탁 드립니다.
Firemonkey 시리얼통신 델파이 -> 안드로이드 시리널통신 도와주세요
2017.09.22 16:02
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 바쁜 와중에도 답변을 주시는 분들께 감사 댓글 필수
-----------------------------------------------------------------------------------------------
델파이코드 송신
procedure TfrmSense.SendData(Cmd: Integer; Temp: Integer);
Var TR : Array[0..6] of Byte ;
strAnsiName : AnsiString;
strName : String;
begin
TR[0] := 1; // T_Pk[0] : SOH
TR[1] := StrToInt(EditID.Text); // T_Pk[1] : 레벨 번호
TR[2] := Cmd; // T_Pk[2] : 오일, 물, 온도
TR[3] := Temp; // T_Pk[3] : 온도 Flag
TR[4] := 0; // T_Pk[4]
TR[5] := 4; // T_Pk[5] : EOT
TR[6] := TR[1] xor TR[2] xor TR[3] xor TR[4] xor TR[5];
ComPort1.Write(TR, 7);
end;
어떤 문제가 발생하시나요?(코드만 보고 문제를 찾는게 쉽지 않습니다.^^)
어떤 문제가 어떤 지점에서 발생하는지도 알려주시면 (혹시나)도움이 되는 답변을 드릴 수 있을 것 같습니다.