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

VB MSComm 轉成 SPComm的問題

尚未結案
jrshin
一般會員


發表:1
回覆:4
積分:1
註冊:2007-08-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-22 16:50:53 IP:140.112.xxx.xxx 訂閱
因為小弟對VB不熟悉,最近需要把一個RS232控制的儀器改成BCB的Code,碰到了一些困難,原本的VB程式碼如下
<textarea name="code" class="vb" rows="10" cols="60">Private Sub Form_Load() ' Load the main form
' Init and open comm port
Static port As Byte
STX = ChrW$(2)
ETX = ChrW$(3)
port = check_comports
MSComm1.CommPort = port ' COM1 by default
MSComm1.Settings = "4800,n,8,1"
MSComm1.InputMode = comInputModeBinary
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.OutBufferSize = 16
MSComm1.InBufferSize = 16
MSComm1.PortOpen = True
Send_command (SETCYCLE0)
Send_command (SETADULT)
Send_command (SETPMP160)
Send_command (READSTATUS) ' Read status values
End Sub
Private Sub Send_command(command As String)
Dim i As Byte
MSComm1.Output = STX ' STX = 2
For i = 1 To LenB(command) ' 6 bytes or 1 byte (abort)
MSComm1.Output = Mid(command, i, 1)
Next i
MSComm1.Output = ETX ' ETX = 3
End Sub
</textarea>
上面是原本的程式碼,我把跟運算不相關的部份都刪除了,就我的猜測,他使用的baudrate 4800,None Parity,8 byte,1 stopbit ,然後我使用SPComm的元件設定,改成如下
<textarea name="code" class="cpp" rows="10" cols="60"> __fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Comm1->BaudRate = 4800;
Comm1->Parity = None;
Comm1->ByteSize = _8;
Comm1->StopBits = _1;
Send_command (SETCYCLE0);
Send_command (SETADULT);
Send_command (SETPMP160);
Send_command (READSTATUS);// ' Read status values
}

//---------------------------------------------------------------------------

void __fastcall TForm1::Send_command(char *command)
{
int len = 0;
len = strlen(command);
Comm1->StartComm();
Comm1->WriteCommData("2",1);
Comm1->WriteCommData(command, len);
Comm1->WriteCommData("3",1);
Comm1->StopComm();
}
//---------------------------------------------------------------------------

</textarea>
不過還是沒有辦法驅動儀器,所以上來請教一下,不知道哪邊還有沒有設定好的地方?
編輯記錄
jrshin 重新編輯於 2007-08-22 17:01:58, 註解 無‧
jrshin 重新編輯於 2007-08-22 17:13:16, 註解 無‧
jrshin 重新編輯於 2007-08-22 17:15:08, 註解 無‧
jrshin 重新編輯於 2007-08-22 17:16:56, 註解 無‧
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-22 20:42:59 IP:59.105.xxx.xxx 訂閱
  1. Comm1->WriteCommData("2",1);
  2. Comm1->WriteCommData(command, len);
  3. Comm1->WriteCommData("3",1);
改成
  1. char STX=2, ETX=3;
  2. Comm1->WriteCommData(&STX,1);
  3. Comm1->WriteCommData(command, len);
  4. Comm1->WriteCommData(&ETX,1);
再試試。因為 STX=2 是指數值的 2 而不是文字的 "2"
------
http://www.ViewMove.com
jrshin
一般會員


發表:1
回覆:4
積分:1
註冊:2007-08-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-23 10:45:44 IP:140.112.xxx.xxx 訂閱

===================引 用 dllee 文 章===================
  1. char STX=2, ETX=3;
  2. Comm1->WriteCommData(&STX,1);
  3. Comm1->WriteCommData(command,len);
  4. Comm1->WriteCommData(&ETX,1);
再試試。因為 STX=2 是指數值的 2 而不是文字的 "2"

嗯,看樣子問題應該是出在這裡沒錯,不過沒有辦法直接改成
Comm1->WriteCommData(&STX,1);來輸出,另外有參考了
http://delphi.ktop.com.tw/board.php?cid=168&fid=917&tid=46029
這一篇,但是還是沒有辦法解決,繼續努力當中,不過先說聲謝謝了。
jrshin
一般會員


發表:1
回覆:4
積分:1
註冊:2007-08-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-23 16:03:36 IP:140.112.xxx.xxx 訂閱
目前已經把程式改成下面這樣,就可以正常執行了,之前出的問題有兩項:
1. STX, ETX要轉成16進位的字串加在命令字串的頭尾
2. Comm1->StartComm();要放在一開始的地方,Comm1->StopComm();要放在整個結束的地方,不能每次發出命令的時候就StartComm();和StopComm();
<textarea name="code" class="cpp" rows="10" cols="60">String head, tail;
char STX = 2;
char ETX = 3;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Comm1->StartComm();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Send_command(String command)
{ head = AnsiString(STX);
tail = AnsiString(ETX);
AnsiString Temp = head command tail;
Comm1->WriteCommData(Temp.c_str(), Temp.Length());
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Comm1->StopComm();
}
//---------------------------------------------------------------------------
</textarea>
系統時間:2024-05-05 0:19:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!