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

關於 傳送16進制的COMMAND 不知為何第一次傳與第二次傳收到的資訊不同

尚未結案
jeff71321
一般會員


發表:6
回覆:14
積分:4
註冊:2005-01-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-22 15:22:58 IP:203.71.xxx.xxx 未訂閱
不好意思,小弟要傳送一組16進制的COMMAND透過RS-232送到設備裡,我參考了站上幾篇文章寫出了傳送端與接收端程式,來檢查傳出的訊息是否正確,但是不知為何,同一個指令,第一次傳出的COMMAND與第2次傳出的..在接收端上出現的資訊卻不同,而且收到的資訊也和我傳出的資料不一樣,不知是哪裏出現的問題,可以請各位大大幫我看看嗎。感謝各位囉!!    傳送端的程式:    
 
#include 
#pragma hdrstop    #include "radio_1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Comm"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 DynamicArray up;
 up.Length=5;
 up[0]=0x4C;
 up[1]=0x41;
 up[2]=0x32;
 up[3]=0x2D;
 up[4]=0x0A;
 Comm1->OutputByte(up);
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormCreate(TObject *Sender)
{    Comm1->PortOpen=true;    }
//---------------------------------------------------------------------------
接收端程式:
    #include 
#pragma hdrstop    #include "receive.h"
//-------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Comm"
#pragma resource "*.dfm"
TForm1 *Form1;
DynamicArray ByteSend,ByteReceive;
String rdata[255];
long i;    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Comm1->PortOpen = true;
ShowMessage("Comm1已開啟");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
 ByteReceive=Comm1->ReadInputByte();
 for(i=0;i<5;i  )
 {
  rdata[i]=IntToHex(ByteReceive[i],1);
 
 }
 
 E1->Text=rdata[0];
 E2->Text=rdata[1];
 E3->Text=rdata[2];
 E4->Text=rdata[3];
 E5->Text=rdata[4];    }
發表人 - jeff71321 於 2005/07/22 17:06:19
jeff71321
一般會員


發表:6
回覆:14
積分:4
註冊:2005-01-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-22 15:45:32 IP:203.71.xxx.xxx 未訂閱
對了....測試方法是利用2台電腦的com1連接在一起....2,3腳位對調進行測試的...COM的設定為9600bps 8位元 無同位元 停止位元為1
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-22 16:37:20 IP:210.68.xxx.xxx 未訂閱
您好:    PO程式碼的方式與版規說明請參考下面連結,煩請修改謝謝您的配合 > 對於您的問題,收資料要在下面的事件中撰寫< class="code"> void __fastcall TForm1::Comm1ReceiveData(TObject *Sender) { //收資料 } 書上的範例您仔細看看裡面有提到 順心
jeff71321
一般會員


發表:6
回覆:14
積分:4
註冊:2005-01-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-22 17:41:31 IP:203.71.xxx.xxx 未訂閱
感謝taishyang大大的回覆...我的格式已經修正了...如果還有問題麻煩您在告訴我,還有大大的意思是指COM元件的EVENTS有一個OnReceiveData的選項在那裡選上Button1Click嗎..還是說要改哪些地方ㄋ,您說的書是不是C BUILER與RS232串列通訊埠這本書ㄋ,我去書店找的時候店員說沒了..我有訂購但是他還沒通知我,請問大大能大概說明一下...該如何使用大大說的方法,還有可以幫我說明一下,像我這樣的寫法,有哪裡是不對ㄉㄋ,因為感覺第一次收到的資料上有些是正確的有些是錯的,但是第2次按下去就變的不一樣了,送的COMMAND是同一個,感覺像會積存...就麻煩各位大大幫我講解一下吧...感恩!!
暗黑破壞神
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-22 21:40:21 IP:59.104.xxx.xxx 未訂閱
引言:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 
 ByteReceive=Comm1->ReadInputByte();
 for(i=0;i<5;i  )
 {
  rdata[i]=IntToHex(ByteReceive[i],1);
 
 }
 
 E1->Text=rdata[0];
 E2->Text=rdata[1];
 E3->Text=rdata[2];
 E4->Text=rdata[3];
 E5->Text=rdata[4];    }
不解,不是應先知道接收了幾個字元。 然後才去讀出幾個嗎??? 你怎麼強制讀五個?怪怪的做法。
jeff71321
一般會員


發表:6
回覆:14
積分:4
註冊:2005-01-20

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-23 15:31:08 IP:203.71.xxx.xxx 未訂閱
    //---------------------------------------------------------------------------    #include 
#pragma hdrstop    #include "receive.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Comm"
#pragma resource "*.dfm"
TForm1 *Form1;
DynamicArray ByteSend,ByteReceive;
String rdata[255];
long i;    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Comm1->PortOpen = true;
ShowMessage("Comm1已開啟");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 String tmpStr;
 tmpStr="";
 ByteReceive=Comm1->ReadInputByte();
  for(i=0;iText=tmpStr;     }
//---------------------------------------------------------------------------
經過暗黑大大剛剛講的我又把程式改成這樣,但是情況還是沒有改變 還有我有用Comm1ReceiveData把此函式裡面寫入
 
void __fastcall TForm1::Comm1ReceiveData(TObject *Sender)
{
  ByteReceive=Comm1->ReadInputByte();
 for(i=0;i<5;i  )
 {
  rdata[i]=IntToHex(ByteReceive[i],1);
 
 }
}
不知taishyang大大寫的意思是否是這樣,但是這樣子用以後情況還是沒有改變 是不是我哪裡用錯了,麻煩大大們指導我,真是太感謝了。 另外..C BUILDER與RS-232這本書,書商說不知何時會再版.....目前沒有書了,我買不到QQ"...學校圖書館休館...我只能靠各位大大指導了...拜託各位大大了...感恩感恩
jeff71321
一般會員


發表:6
回覆:14
積分:4
註冊:2005-01-20

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-23 21:51:18 IP:203.71.xxx.xxx 未訂閱
   
#include 
#pragma hdrstop    #include "receive.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "Comm"
#pragma resource "*.dfm"
TForm1 *Form1;
DynamicArray ByteSend,ByteReceive;
String rdata[255];
String tmpStr;    long i;    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
Comm1->PortOpen = true;
ShowMessage("Comm1已開啟");
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Comm1ReceiveData(TObject *Sender)
{
 ByteReceive=Comm1->ReadInputByte();
 for(i=0;iText=tmpStr;
}
//---------------------------------------------------------------------------
 
不好意思...我剛剛將接收端改成使用Comm1ReceiveData但是他在Memo1上顯示的訊息並不是我傳送端所傳的封包4C 41 32 2D 0A而且每次傳送同一個封包資料第一次收到與第2次收到的顯示資料也不一樣,我知道我哪邊一定還有錯誤 想請各位大大教導我哪邊是不正確的?還是說我傳送端的寫法有錯...謝謝
暗黑破壞神
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-07-23 23:43:38 IP:59.104.xxx.xxx 未訂閱
你要不要去試試 turbopower 的 async pro? 你的這些東西。在它的 doc 中的前幾頁就寫了。 turbopower 去 google 查一下吧。 有 free source 的。 因為我搞不清你是用什麼元件的。
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-07-25 09:19:21 IP:210.68.xxx.xxx 未訂閱
事是改成下面這樣 < class="code"> void __fastcall TForm1::Comm1ReceiveData(TObject *Sender) { ByteReceive = Comm1->ReadInputByte(); for(i=0; iLines->Add(IntToHex(ByteReceive[i], 2); } }
jeff71321
一般會員


發表:6
回覆:14
積分:4
註冊:2005-01-20

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-07-26 20:39:47 IP:203.71.xxx.xxx 未訂閱
taishyang大大 您說的方式我有用了....情況一樣 但是我發現我的問題在於用單台電腦將其RS232的TX與RX兩隻腳短路 這樣測試資料就會是正確的,但是如果我用2台電腦測試將其中1台電腦的TX與RX對調然後兩台電腦做傳輸測試就會出現傳第一次與第2次的收到資料不同 請問有大大知道是為何會這樣嗎 還有我用的元件是用 C Builder與RS232串列通訊埠裡面所寫的TCOMM 因為之前同學有借過這本書檔案有留著
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-07-27 00:20:09 IP:218.168.xxx.xxx 未訂閱
是硬體的問題嗎? 下面連結有線路的說明
jcjroc
高階會員


發表:21
回覆:279
積分:115
註冊:2002-09-18

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-07-27 13:57:43 IP:211.75.xxx.xxx 未訂閱
引言: taishyang大大 您說的方式我有用了....情況一樣 但是我發現我的問題在於用單台電腦將其RS232的TX與RX兩隻腳短路 這樣測試資料就會是正確的,但是如果我用2台電腦測試將其中1台電腦的TX與RX對調然後兩台電腦做傳輸測試就會出現傳第一次與第2次的收到資料不同 請問有大大知道是為何會這樣嗎 還有我用的元件是用 C Builder與RS232串列通訊埠裡面所寫的TCOMM 因為之前同學有借過這本書檔案有留著
你兩台電腦在傳輸資料前是否有先做同步ㄋ, 你可以試著將傳輸速度調慢一點看看.
jeff71321
一般會員


發表:6
回覆:14
積分:4
註冊:2005-01-20

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-07-27 15:48:43 IP:203.71.xxx.xxx 未訂閱
jcjroc大大...不好意思喔 我想請問一下,如果說需要做同步的話,又應該要如何做ㄋ 因為我現在有一組VB的傳送指令程式是設備的公司寫的,我想知道那個程式送的封包,送出來是啥資料,因為它給的說明資料裡的指令似乎給的不正確,但是他的VB程式可以控制設備,我又不是很懂VB(只能大概知道他程式內是在寫啥動作),所以想寫接收程式來看VB所送出來的資料。 或是說有大大能夠幫我看看他VB的程式(不知這能不能貼VB的程式上來),看我傳送端寫的封包指令與他的VB端寫的有啥不同。真的非常感謝大家
jeff71321
一般會員


發表:6
回覆:14
積分:4
註冊:2005-01-20

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-07-27 20:02:46 IP:203.71.xxx.xxx 未訂閱
各位大大...我已經找到問題了..原來我的GND接觸不良...所以才會這樣 還有我廠商給的封包指令5個BYTE居然有3個是錯的..難怪我怎麼送都不會動 感謝各位大大的幫忙,那我這分就送給taishyang了....感謝囉....之後還有問題....就拜託各位幫幫忙了
系統時間:2024-04-26 13:25:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!