VB MSComm 轉成 SPComm的問題 |
尚未結案
|
jrshin
一般會員 發表:1 回覆:4 積分:1 註冊:2007-08-08 發送簡訊給我 |
因為小弟對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> 不過還是沒有辦法驅動儀器,所以上來請教一下,不知道哪邊還有沒有設定好的地方? |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
------
http://www.ViewMove.com |
jrshin
一般會員 發表:1 回覆:4 積分:1 註冊:2007-08-08 發送簡訊給我 |
===================引 用 dllee 文 章===================
嗯,看樣子問題應該是出在這裡沒錯,不過沒有辦法直接改成Comm1->WriteCommData(&STX,1);來輸出,另外有參考了 http://delphi.ktop.com.tw/board.php?cid=168&fid=917&tid=46029 這一篇,但是還是沒有辦法解決,繼續努力當中,不過先說聲謝謝了。 |
jrshin
一般會員 發表:1 回覆:4 積分:1 註冊:2007-08-08 發送簡訊給我 |
目前已經把程式改成下面這樣,就可以正常執行了,之前出的問題有兩項:
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> |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |