線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:13504
推到 Plurk!
推到 Facebook!
[<<] [1] [2] [>>]

請教TApdComport 元件的使用

答題得分者是:暗黑破壞神
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-23 20:53:32 IP:203.67.xxx.xxx 未訂閱
各位高手大大們,有沒有TurboPower Async Professional 套件裡的 TApdComport 元件的使用範例程式碼,原文那個說明檔我實在真的看不懂,但又不想再使用vb內附的mscomm元件,請大大指導一下,感恩不盡
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-23 23:44:41 IP:221.169.xxx.xxx 未訂閱
它的使用手冊上寫得很清楚要怎麼用。 不然。你也可以看它的說明檔中的程式部份。 根本不用去理會它寫的那些英文吧。 再不然。你要問什麼問題?總不會是要我們替 TurboPower 教你使用這個東西吧。 這樣的問題太廣範了吧。
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-24 18:09:45 IP:203.73.xxx.xxx 未訂閱
小弟是有個案子要用到,傳輸的資料是放到陣列中,陣列長度是不固定的,例如 InBuff:= comm1.input;InBuff is dynamic array type, comm1.out := OutBuff 但說明檔的範例我就是不會用呀,而且程式碼寫的很多又雜,根本不知要從何截取使用,所以才請教大大們有沒有簡單一點的範例就像是 1:port開啟 2:將要送的陣列資料餵給元件 3:從元件接收資料到陣列 4:port關閉 以上動作都是為了modbus rtu所用,就這樣囉,感謝大大們指導囉
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-24 18:16:41 IP:221.169.xxx.xxx 未訂閱
引言: 小弟是有個案子要用到,傳輸的資料是放到陣列中,陣列長度是不固定的,例如 InBuff:= comm1.input;InBuff is dynamic array type, comm1.out := OutBuff 但說明檔的範例我就是不會用呀,而且程式碼寫的很多又雜,根本不知要從何截取使用,所以才請教大大們有沒有簡單一點的範例就像是 1:port開啟 2:將要送的陣列資料餵給元件 3:從元件接收資料到陣列 4:port關閉 以上動作都是為了modbus rtu所用,就這樣囉,感謝大大們指導囉 < face="Verdana, Arial, Helvetica"> 1.設成 autoopen 就不用管它開關了。 不然有個 open = true; open = false 就可以開關。 2.用 putchar 就可以把東西由232丟出來了。自己寫迴圈處理。HELP有講。 3.利用ontriggeravail 去做接收。自己看它的HELP怎麼寫。 4.同第一點。 方向給了。自己去看HELP。自己去試。 不然出了狀況。你還會無法解決。 http://www.mcu51.com/list.asp?id=1588 想想別人怎麼學,我們有這麼用心嗎? 憂心啊~~~~~~
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-24 19:19:38 IP:203.73.xxx.xxx 未訂閱
我再試看看,謝謝
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-05-09 00:58:28 IP:211.76.xxx.xxx 未訂閱
引言: 1.設成 autoopen 就不用管它開關了。 不然有個 open = true; open = false 就可以開關。 2.用 putchar 就可以把東西由232丟出來了。自己寫迴圈處理。HELP有講。 3.利用ontriggeravail 去做接收。自己看它的HELP怎麼寫。 4.同第一點。 方向給了。自己去看HELP。自己去試。 不然出了狀況。你還會無法解決。
以下是小弟的程式,但使用並不成功,inbuff為接受自commport的資料,要移做設備讀值(如sign integer ,unsign integer,.... etc.),請大大指導錯誤所在,謝謝 unit frmMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, OoMisc, AdPort, StdCtrls; type TForm1 = class(TForm) Comm1: TApdComPort; Label1: TLabel; btnExit: TButton; procedure FormCreate(Sender: TObject); procedure btnExitClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var inbuff : char; begin comm1.ComNumber:=1; comm1.Baud:=9600; comm1.Parity:=pnone; comm1.DataBits:=8; comm1.Open:=true; inbuff := comm1.GetChar ; if inbuff := null then label1.Caption:= "No data"; else label1.Caption:= inbuff; end if end; procedure TForm1.btnExitClick(Sender: TObject); begin comm1.Open:=false; close; end; end.
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-05-09 05:11:29 IP:211.74.xxx.xxx 未訂閱
引言: 3.利用ontriggeravail 去做接收。自己看它的HELP怎麼寫。
請問。你這一段的程式呢?
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-05-09 07:31:02 IP:211.76.xxx.xxx 未訂閱
接收就直接寫在form的oncreat事件裡,或者以後會寫在timer裡,因為之前使用vb的mscomm元件是寫在timer的ontrigger裡,小弟看apdcomport的help有很多種事件,如ontriggeravil,ontriggeroutsend,....等,好幾個event都可以把接收程式寫在裡頭(還是一定要寫在OnTriggerAvail裡?),根本不知要寫在哪個事件才對,所以才會依舊習慣,直接呼叫apdcomport.getchar,也就因為不熟悉這個元件的呼叫方式(包括通訊參數的指定無法像其他元件可以直接指定9600,n,8,1甚至直接把參數讀自ini檔),help檔又寫的很片段,才會需要大大們能給我完整的程式片段(小弟的英文真的不好,實在不容易看懂help在寫啥),付上我的程式就是希望大大能指導我使用上的錯誤,不然我再重寫一個接收跟傳送各在一個timer裡的程式讓大大指導錯誤可以嗎,謝謝
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-05-09 09:03:33 IP:61.66.xxx.xxx 未訂閱
小弟再附上之前用mscomm寫的程式片段 procedure TfrmMain.FormCreate(Sender: TObject); var OutByte: Array[0..10] Of Byte ; inbyte : Array[0..1024] Of Byte; crcData : Word ; StrByte : OleVariant; Meter_Val : Single ; begin mscomm.CommPort:=1; mscomm.Settings:= '9600,n,8,1'; mscomm.InputMode:=1; mscomm.PortOpen:= true; outbyte[0] := $01; outbyte[1] := $03; outbyte[2] := $00; outbyte[3] := $1A; outbyte[4] := $00; outbyte[5] := $02; CrcData := crc16( outbyte , 6 ); // 算出CRC值後再寫入到outbyte[6..7] outbyte[6] := Trunc(crcData/256) ; outbyte[7] := (crcData Mod 256); MsComm.out := outbyte; inbyte := MsComm.input;
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-05-09 10:36:58 IP:211.74.xxx.xxx 未訂閱
引言: 接收就直接寫在form的oncreat事件裡,或者以後會寫在timer裡,因為之前使用vb的mscomm元件是寫在timer的ontrigger裡,小弟看apdcomport的help有很多種事件,如ontriggeravil,ontriggeroutsend,....等,好幾個event都可以把接收程式寫在裡頭(還是一定要寫在OnTriggerAvail裡?),根本不知要寫在哪個事件才對,所以才會依舊習慣,直接呼叫apdcomport.getchar,也就因為不熟悉這個元件的呼叫方式(包括通訊參數的指定無法像其他元件可以直接指定9600,n,8,1甚至直接把參數讀自ini檔),help檔又寫的很片段,才會需要大大們能給我完整的程式片段(小弟的英文真的不好,實在不容易看懂help在寫啥),付上我的程式就是希望大大能指導我使用上的錯誤,不然我再重寫一個接收跟傳送各在一個timer裡的程式讓大大指導錯誤可以嗎,謝謝 < face="Verdana, Arial, Helvetica"> 1.你懂不懂 Delphi 的 onFormCreate 幹了什麼事? 2.如果你要問問題。而別人也給了答案。那請你按著答案去試一次吧。 否則。要完全依你的方法去做。那你就慢慢玩吧。 3.再次要求你依我的指示。去完成它。
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-05-09 12:00:21 IP:61.66.xxx.xxx 未訂閱
引言: 1.你懂不懂 Delphi 的 onFormCreate 幹了什麼事? 2.如果你要問問題。而別人也給了答案。那請你按著答案去試一次吧。 否則。要完全依你的方法去做。那你就慢慢玩吧。 3.再次要求你依我的指示。去完成它。
大大您別生氣嘛,小弟真的不是很懂,所以才會問(第一點真的不是很懂),在來是,小弟要的是兩個TIMER,一個管傳送,一個管接收,而OnTriggerAvail只是單一事件,如何在兩個timer中各別獨立呼叫,大大您就大人大量,不厭其煩,講清楚一點我的疑惑,為何會使用這個event而不是其他的event,小弟第一次用,困惑(白癡問題)一定會很多的,您就海量包容一下囉
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-05-09 12:23:29 IP:221.169.xxx.xxx 未訂閱
引言:
引言: 1.你懂不懂 Delphi 的 onFormCreate 幹了什麼事? 2.如果你要問問題。而別人也給了答案。那請你按著答案去試一次吧。 否則。要完全依你的方法去做。那你就慢慢玩吧。 3.再次要求你依我的指示。去完成它。
大大您別生氣嘛,小弟真的不是很懂,所以才會問(第一點真的不是很懂),在來是,小弟要的是兩個TIMER,一個管傳送,一個管接收,而OnTriggerAvail只是單一事件,如何在兩個timer中各別獨立呼叫,大大您就大人大量,不厭其煩,講清楚一點我的疑惑,為何會使用這個event而不是其他的event,小弟第一次用,困惑(白癡問題)一定會很多的,您就海量包容一下囉 < face="Verdana, Arial, Helvetica"> 真會被你。。。。。。。。。最近心跳都維持在>>> >
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-05-09 13:22:38 IP:61.66.xxx.xxx 未訂閱
大大,您可能誤會了,我在之前的文章有提到,這是設備通訊用的(數位多功能電表),因為有很多個站,所以要分兩個timer,一個是管對哪一站要資料,而且有時要分好幾次才能把所有暫存器的值都抓回來,另一個當然就是送出查詢字串後的接收動作囉,這樣講你能了解我為何要分兩的timer了嗎,還有,我送出的485 modbus命令字串是byte of array,接收也是byte型態,包括crc16也是接收byte陣列(三篇回應之前應該有po),但apdcomport接受的是char跟string,是否通用,因為我用起來數值怪怪的,煩請解答,謝謝囉
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-05-09 13:27:18 IP:61.66.xxx.xxx 未訂閱
引言: AnsiString S; for (int i=0;iGetChar(); Memo1->Lines->Add(S);
大大,這好像是c builder的語法,delphi對pchar的支援從7版就列入"unsave"了喔
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-05-09 14:01:32 IP:221.169.xxx.xxx 未訂閱
引言: 大大,您可能誤會了,我在之前的文章有提到,這是設備通訊用的(數位多功能電表),因為有很多個站,所以要分兩個timer,一個是管對哪一站要資料,而且有時要分好幾次才能把所有暫存器的值都抓回來,另一個當然就是送出查詢字串後的接收動作囉,這樣講你能了解我為何要分兩的timer了嗎,還有,我送出的485 modbus命令字串是byte of array,接收也是byte型態,包括crc16也是接收byte陣列(三篇回應之前應該有po),但apdcomport接受的是char跟string,是否通用,因為我用起來數值怪怪的,煩請解答,謝謝囉
1.485 已經是架構問題了。要動到通訊協定了。不是你用 timer 可以解決的。 2.Delphi 怎麼搞定那些基本型態。你自己去處理。沒理由要教到這種基本的東西。 3.基本的動作都沒還確認。你就去搞那些鳥東西? 你知道在寫程式時。就像在攀岩。要保持三點不動一點動。 你把所有能動的都動了。你就等著摔下山吧。 先確定那些東西是正確的。你再去改一部份一部份的變因。這樣你的程式才能完成。 這些都是入門要學的。現在還在這個地方踏步?真的很懷疑這樣的情況。怎麼把 AsyncPro 整進來。
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-05-10 00:22:23 IP:211.76.xxx.xxx 未訂閱
引言: 1.485 已經是架構問題了。要動到通訊協定了。不是你用 timer 可以解決的。
1,跟485無關,要小弟用vb寫都不是問題,,在vb中只要timer時間一到即可觸發收或送的程式螞,收送的程式都會寫,只是vb先天限制太多,所以轉型至delphi撰寫,而apdcomport功能及複雜度遠勝於vb內建的mscomm元件許多,呼叫方式亦複雜的多,所以才有這些怪問題,但可以確定的一點,呼叫收或送的程式勢必要寫在timer的ontimertrigger中,但此時卻要呼叫ontriggeravail event,就是這點把我搞混了,不知如何在event中又呼叫event 2.oop的觀念雖然相同,但各語言的差異,是小弟跨過門檻的障礙,只要這障礙跨過了,後面的道路小弟有自信能自己走 3.大大或許您認為這些問題很不上抬面,但卻是我們這些入門者學習上的大絆腳石,您可能信手捻來就可以輕鬆寫出一段程式,但我們是擠破頭卻也想不通呀,其他版的大大或版主有可能功力不若您,但他們卻很願意"秀"部份程式片段給我們這些入門者參考,而非單只有文字的敘述,而這小小的片段程式往往能讓我們的困惑豁然開朗喔,雖然小弟很笨,但還是萬分感謝您不吝花時間指點我,剩下的我再想辦法問程度比較接近我的,可能比較容易"切磋求進步"。小弟的一點心聲,若有冒犯之處,還請海涵
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-05-10 08:32:49 IP:202.39.xxx.xxx 未訂閱
引言: 1,跟485無關,要小弟用vb寫都不是問題,,在vb中只要timer時間一到即可觸發收或送的程式螞,收送的程式都會寫,只是vb先天限制太多,所以轉型至delphi撰寫,而apdcomport功能及複雜度遠勝於vb內建的mscomm元件許多,呼叫方式亦複雜的多,所以才有這些怪問題,但可以確定的一點,呼叫收或送的程式勢必要寫在timer的ontimertrigger中,但此時卻要呼叫ontriggeravail event,就是這點把我搞混了,不知如何在event中又呼叫event
我想您對 OnTriggerAvail Event 誤解了 只要 Comport 有收到資料, 這個 Event 就會觸發 在 Event 觸發時再去做處理 使用者不需要在 Timer 裡去呼叫, 也不應該去呼叫 再者您可以用如下的流程來做收送的動作: 1.TApdComport.Output := 'xxx'; // 傳送字串 2.Delay 一段時間, 等待 OnTriggerAvail Event 觸發 可以設個變數來判斷 OnTriggerAvail Event 有沒有觸發 沒有觸發表示 Timeout 沒收到資料 3.再做接下來的事 ... 如前幾篇討論提到的, TApdComport 有很多 Trigger 的 Event OnTriggerAvail 的意思上面有說 其它小弟會用的像是 OnTriggerData 假設如下一行設了一 TriggerHandle: LoginTrig := TApdComPort.AddDataTrigger('login:', True); PasswordTrig := TApdComPort.AddDataTrigger('password:', True); 然後 TApdComPort 在收到 login: 或 password: 字串時 就會發觸 OnTriggerData 事件 這個事件中有個 TriggerHandle 參數 如果 TriggerHandle 值等於 LoginTrig 表示收到 login: 字串 如果 TriggerHandle 值等於 PasswordTrig 表示收到 password: 字串 您可以依程式的需求來搭配 當然您可以不用它的事件中來接資料 比方說用個 Timer 來檢查 然後在 Timer 裡用 GetChar 或 GetBlock 的方式來取得收到的資料 如果所收到的資料很有規則的話 TApdDataPacket 元件也不錯用 -- hagar.
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#18 引用回覆 回覆 發表時間:2005-05-10 11:39:58 IP:221.169.xxx.xxx 未訂閱
引言: 1,跟485無關,要小弟用vb寫都不是問題,,在vb中只要timer時間一到即可觸發收或送的程式螞,收送的程式都會寫,只是vb先天限制太多,所以轉型至delphi撰寫,而apdcomport功能及複雜度遠勝於vb內建的mscomm元件許多,呼叫方式亦複雜的多,所以才有這些怪問題,但可以確定的一點,呼叫收或送的程式勢必要寫在timer的ontimertrigger中,但此時卻要呼叫ontriggeravail event,就是這點把我搞混了,不知如何在event中又呼叫event 2.oop的觀念雖然相同,但各語言的差異,是小弟跨過門檻的障礙,只要這障礙跨過了,後面的道路小弟有自信能自己走 3.大大或許您認為這些問題很不上抬面,但卻是我們這些入門者學習上的大絆腳石,您可能信手捻來就可以輕鬆寫出一段程式,但我們是擠破頭卻也想不通呀,其他版的大大或版主有可能功力不若您,但他們卻很願意"秀"部份程式片段給我們這些入門者參考,而非單只有文字的敘述,而這小小的片段程式往往能讓我們的困惑豁然開朗喔
1.請你依我說的下去做。開個空的 project 去依我上一個指示去做。 2.想用 Delphi 請先了解它。不要用VB的使用方式來用它。 Delphi 是一種 event 模式。 VB 是 polling 模式。兩個是不同的。 event 就像是中斷一樣。只要條件達成。就會觸發。 polling 就是你要在程式中,一次兩次三次一直去問它,有沒有東西進來。 兩種模式是不同的。 3.我也依最簡單的方式要你開空 project 然後把它的接收方式寫出來給你了啊。 難道你要我像寫書那樣。連圖連動畫。都貼上來教你嗎? 請按照我之前寫的程序去做。先放掉你的成見。依我說的去做。 依那樣做,有問題再提出吧。

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-05-10 15:12:22 IP:211.22.xxx.xxx 未訂閱
Delphi 不是 VB! 既然你已經請教懂得Delphi的人,就照人家的指導方式做一次吧!! 別再用你寫VB的思考邏輯去寫囉!!你這樣難怪暗黑大仔會生氣壓.. 設身處地想一下貝!!
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#20 引用回覆 回覆 發表時間:2005-05-10 15:28:56 IP:61.66.xxx.xxx 未訂閱
看了hagar大大的解釋,我想我應該知道問題點在哪了,確實是使用觀念的差異,我會改過來滴,剩下的部份我會再試試看,但有一個問題,我翻遍help檔,都沒提到apdcomport有類似count這個變數讓user拿來檢查傳送或接受的byte數對不對,是否要用類似下列語法才能辦到 var str : string; i, j : integer ; for i=1 to 40 str = str apdcomport.getchar(); j = strlen(str); 判斷收到的位元總數是否正確,大大們看的懂小弟在問啥嗎,謝謝
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#21 引用回覆 回覆 發表時間:2005-05-10 15:57:50 IP:202.39.xxx.xxx 未訂閱
procedure ApdComPortTriggerAvail(CP : TObject; Count : Word); 看一下 OnTriggerAvail Event 裡的 Count 這個變數 它就是指收到多少長度(bytes)的字串資料 -- hagar.
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#22 引用回覆 回覆 發表時間:2005-05-10 16:48:37 IP:61.66.xxx.xxx 未訂閱
了解了,難怪暗黑大一直要我用這
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#23 引用回覆 回覆 發表時間:2005-05-10 17:12:45 IP:221.169.xxx.xxx 未訂閱
引言: 看了hagar大大的解釋,我想我應該知道問題點在哪了,確實是使用觀念的差異,我會改過來滴,剩下的部份我會再試試看,但有一個問題,我翻遍help檔,都沒提到apdcomport有類似count這個變數讓user拿來檢查傳送或接受的byte數對不對,是否要用類似下列語法才能辦到
var 
   str : string;
   i, j : integer ;
for i=1 to 40 
   str = str   apdcomport.getchar();
j = strlen(str);
判斷收到的位元總數是否正確,大大們看的懂小弟在問啥嗎,謝謝
唉。。。。你要這樣寫。。。會死人啦。 基本上用這個動作。你要了解一件事。是 com port 把東西丟進來時。 會觸動一次 event. 而一次 event 可能就會收進來 14 bytes 我的經驗是 max 14bytes 讀入。 所以。你這樣寫。除非你傳送的資料少於 14 bytes 否則。你永遠都會 check error. 會跟你說用 AnsiString S 一直去累加。是一種舉例。 可是。當資料不是可見文數字時呢? 比方說 '\0' 這種 null 呢? 你是不是要自己修改這個東西。把收到的資料丟進 memory. 之所以說 memory 是因為它不會因為 null 而代表結束。。。。。 而你應該要再做的是: 當收到某個 字元 時。表示這一行結束。ex. '\n', or '\r' 舉個例來說 你外面會送來 "this is a test string........\n" 這個很明顯的超過 14 bytes 所以。你會在兩次的 on..... 來接收。 所以你在 ontriggeravail 的函數中。要去對收到的字做判別。 以C來說
.....
AnsiString S;
ontriggeravail(...)
{
char c;
for (int i=0;iGetChar();
if (c == '\n')
{
// 幹你該幹的事。
}
else
S  = ApdComPort->GetChar();
}
}
其他的問題就是你對 Delphi 的問題了。無關 AsyncPro 了。
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#24 引用回覆 回覆 發表時間:2005-05-10 17:50:31 IP:61.66.xxx.xxx 未訂閱
哇,一次只能14byte,那可就慘了,我的通訊資料(電表數值),一次最多可達125bytes,那豈不是要收到死,要分近10次才收的完,而且資料99%都是不可見字元,apdcomport怎麼可能幹這種事,不被罵死才怪,它可是我所知道工控界,只要是用c-builder或delphi的,使用比例最高的,難不成他們都分那麼多次收,效能太差了,我覺得不太可能吧,另外我的程式這一兩天應該就會完成主體,到時再測一下多位元接收能不能負荷
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#25 引用回覆 回覆 發表時間:2005-05-10 17:54:00 IP:61.66.xxx.xxx 未訂閱
附帶說明,接收的電表讀值80%都是hex 00 ,所以我試著用getchar()還真給我"秀斗"勒,還在找解決方案中
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#26 引用回覆 回覆 發表時間:2005-05-10 19:49:14 IP:221.169.xxx.xxx 未訂閱
引言: 附帶說明,接收的電表讀值80%都是hex 00 ,所以我試著用getchar()還真給我"秀斗"勒,還在找解決方案中 < face="Verdana, Arial, Helvetica"> getchar() 可以用啊。而且還只有它可以讓你用。 所以我才說啊。 把收到的資料丟進 memory. 之所以說 memory 是因為它不會因為 null 而代表結束。。。。。 真怪勒。我不是把解法都給你了嗎?
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#27 引用回覆 回覆 發表時間:2005-05-10 23:38:13 IP:211.76.xxx.xxx 未訂閱
引言:
引言: 附帶說明,接收的電表讀值80%都是hex 00 ,所以我試著用getchar()還真給我"秀斗"勒,還在找解決方案中 < face="Verdana, Arial, Helvetica"> getchar() 可以用啊。而且還只有它可以讓你用。 所以我才說啊。 把收到的資料丟進 memory. 之所以說 memory 是因為它不會因為 null 而代表結束。。。。。 真怪勒。我不是把解法都給你了嗎? < face="Verdana, Arial, Helvetica"> 拍謝啦,這次"純粹"是用法錯誤,資料判斷式去剔除到null,已經在修改中了,之前用getchar跟getstring沒搞對 舉例來說,傳回的資料為
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#28 引用回覆 回覆 發表時間:2005-05-14 17:01:50 IP:211.76.xxx.xxx 未訂閱
小弟改寫程式了,但用法上有點問題,請大大指導一下 unit frmMain;    interface    uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,   Dialogs, OoMisc, AdPort, StdCtrls, ExtCtrls,Func;    type   TForm1 = class(TForm)     Comm1: TApdComPort;     Label1: TLabel;     btnExit: TButton;     btnSend: TButton;     Timer1: TTimer;     procedure FormCreate(Sender: TObject);     procedure btnExitClick(Sender: TObject);     procedure Comm1TriggerAvail(CP: TObject; Count: Word);     procedure Timer1Timer(Sender: TObject);   private     { Private declarations }   public     { Public declarations }   end;    var   Form1: TForm1;    implementation    {$R *.dfm}    procedure TForm1.FormCreate(Sender: TObject); begin   comm1.ComNumber:=1;   comm1.Baud:=9600;   comm1.Parity:=pnone;   comm1.DataBits:=8;   comm1.Open:=true;    end;    procedure TForm1.btnExitClick(Sender: TObject); begin   comm1.Open:=false;   close; end;    procedure TForm1.Comm1TriggerAvail(CP: TObject; Count: Word);  var      i : integer;      inbuff : string; begin   timer1.Enabled := false;   for i:=0 to count-1 do     inbuff := inbuff + comm1.GetChar ;      label1.Caption:=inbuff;   timer1.Enabled := true;    end;    procedure TForm1.Timer1Timer(Sender: TObject);  var    OutByte: Array[0..7] Of byte;    crcData : Word ;    meter_val : Single ;    begin      OutByte[0] := $01;      OutByte[1] := $03;      OutByte[2] := $03;      OutByte[3] := $e9;      OutByte[4] := $00;      OutByte[5] := $01;      CrcData := crc16( outbyte , 6 );   // 算出CRC值後再寫入到outbyte[6..7]      outbyte[6] := Trunc(crcData/256) ;      outbyte[7] := (crcData Mod 256);      comm1.Output := OutByte;       ^^^^^^^^^^^^^^^^^^incompatible types: 'array' and 'string' end; end. 如果改成comm1.output:= (str(OutByte))會出現Imcompatible types;,請問有解ㄇ 附上crc16的含式 function CRC16(CRCData: array of Byte; Datalen: Integer):Word; var CRC16Lo: Byte; CRC16Hi: Byte; SaveLo:Byte; SaveHi:Byte; GLo:Byte; GHi:Byte; i:Integer; Flag:Integer; begin CRC16Lo:=$ff; CRC16Hi:=$ff; GLo:=$01; GHi:=$a0; for i:=0 to Datalen -1 do begin CRC16Lo:=CRC16Lo xor CRCData[i]; for Flag :=0 to 7 do begin SaveLo:=CRC16Lo; SaveHi:=CRC16Hi; CRC16Hi:=CRC16Hi shr 1; CRC16Lo:=CRC16Lo shr 1; if (SaveHi and $01) = $01 then CRC16Lo:=CRC16Lo or $80; if (SaveLo and $01) = $01 then begin CRC16Hi:=CRC16Hi xor GHi; CRC16Lo:=CRC16Lo xor GLo; end; end; end; CRC16 := CRC16Lo * 256 CRC16Hi; end; 發表人 - wychen57 於 2005/05/14 17:04:35
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#29 引用回覆 回覆 發表時間:2005-05-14 17:56:03 IP:59.104.xxx.xxx 未訂閱
這個已經不是 TApdComport 的問題了。 這是 Delphi 的型別轉換問題了。 你先查清楚 comm1.Output 是什麼型別 而你的 OutByte 是什麼型別。 要怎麼由 OutByte 轉成 comm1.Output 的型別。 這比你在這邊問會比較快。 因為我是用 C Builder。不是用Delphi的。 所以我只能給你 asyncpro 的用法。
wychen57
一般會員


發表:32
回覆:77
積分:21
註冊:2003-10-04

發送簡訊給我
#30 引用回覆 回覆 發表時間:2005-05-14 19:30:38 IP:203.73.xxx.xxx 未訂閱
我的程式寫的很清楚呀,outbyte是byte陣列,所以我用str函數轉成string,comm1.output也是string呀,不知為何會type會不一樣

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#31 引用回覆 回覆 發表時間:2005-05-15 00:35:00 IP:220.134.xxx.xxx 未訂閱
這個已經不是 TApdComport 的問題了耶... wychen57兄...另開新題再問吧...
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
[<<] [1] [2] [>>]
系統時間:2024-04-20 11:08:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!