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

RS232 接收資料斷行

答題得分者是:foreman
seeing
初階會員


發表:49
回覆:131
積分:41
註冊:2002-11-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-05-21 18:59:57 IP:220.128.xxx.xxx 訂閱
請問各位先進,小弟的 RS232 程式在接收上有時會出現資料斷行的情形,如應該是十個 byte 的資料,可能會變成第一次接收 2 個,第二次接收8個的問題,而且隨著電腦不同,也會有不同的差異。想請問這是什麼問題造成的?

若以其它程式輔助監控,也確實可以看到斷行的情形

假設硬體是沒問題的情況下,有可能是因為元件的問題嗎?目前小弟是使用 SPComm,如果是,有建議的元件可用嗎,付費亦可

謝謝
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-05-21 19:19:53 IP:118.169.xxx.xxx 訂閱
請參考:SPCOMM 接收方面問題
http://delphi.ktop.com.tw/board.php?cid=168&fid=917&tid=81098
似乎是一樣的情況
編輯記錄
taishyang 重新編輯於 2009-05-21 19:20:38, 註解 無‧
seeing
初階會員


發表:49
回覆:131
積分:41
註冊:2002-11-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-05-21 20:40:31 IP:123.110.xxx.xxx 訂閱
所以不管是用什麼程式接收,資料會出現斷行是正常的囉?

只要能把後續的資料重組正確即可嗎?
taishyang
站務副站長


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-05-21 20:47:31 IP:118.169.xxx.xxx 訂閱
通常都會利用protocol來確認傳送的封包是否完整/正確
ex. [header][length][data0~n][checksum]



===================引 用 seeing 文 章===================
所以不管是用什麼程式接收,資料會出現斷行是正常的囉?

只要能把後續的資料重組正確即可嗎?
seeing
初階會員


發表:49
回覆:131
積分:41
註冊:2002-11-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-05-21 21:02:34 IP:123.110.xxx.xxx 訂閱
目前的設計是,當收到的資料不正確(含斷行),會叫硬體重送

但為了減少重送的次數及時間,所以才想問看看如何才能使資料接收進來時是沒有斷行的
Roach
中階會員


發表:61
回覆:104
積分:98
註冊:2002-11-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-05-23 10:06:27 IP:218.168.xxx.xxx 訂閱
小弟我猜想不是你元件與程式問題
是設備端本來就分成兩行傳送(或者傳出來的data內含有換行字元)
我之前也使用rs232連接電子天平(秤SMD料件)
連接四個通道的溫度感測器
連接XYZ三軸的工作平台

有些設備會將feedback的資訊分成兩行送給你
收到字串後把斷行的字元(例如'\n' )自行刪掉即可

剛沒注意到"不同電腦不同結果"
這個問題沒有碰到過
編輯記錄
Roach 重新編輯於 2009-05-23 10:12:21, 註解 無‧
Roach
中階會員


發表:61
回覆:104
積分:98
註冊:2002-11-05

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-05-23 10:16:03 IP:218.168.xxx.xxx 訂閱
覆上先前的code給你
執行緒的部分要自己寫

[code cpp]
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Read232 = new TReadThread(true);
Read232->FreeOnTerminate = true ;

char *ComNo ;
DCB dcb;
String Temp="COM1" ;
ComNo = Temp.c_str();
hComm = CreateFile( ComNo,GENERIC_READ | GENERIC_WRITE , 0 , NULL , OPEN_EXISTING , 0 , 0 );
if( hComm == INVALID_HANDLE_VALUE )
{
ShowMessage("開啟通信埠有問題 2 ");
return;
}

GetCommState( hComm,&dcb );
dcb.BaudRate = CBR_9600 ;
dcb.ByteSize = 8 ;
dcb.Parity = NOPARITY ;
dcb.StopBits = ONESTOPBIT ;

if( !SetCommState(hComm,&dcb) )
{
ShowMessage(" 設定通信埠錯誤 ");
CloseHandle(hComm);
}

Read232->Resume();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
Read232->Terminate();
if( hComm!=INVALID_HANDLE_VALUE )
CloseHandle(hComm);
exit(EXIT_SUCCESS);
}
//---------------------------------------------------------------------------



[/code]
編輯記錄
Roach 重新編輯於 2009-05-23 10:17:54, 註解 無‧
foreman
高階會員


發表:3
回覆:124
積分:190
註冊:2004-09-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-05-24 12:00:08 IP:125.233.xxx.xxx 未訂閱
大大:
我的方法加這幾行就可解決.
GetCommTimeouts(hComm,&commtimeouts);
commtimeouts.ReadIntervalTimeout=2;
commtimeouts.ReadTotalTimeoutMultiplier=0;
commtimeouts.ReadTotalTimeoutConstant=0;
commtimeouts.WriteTotalTimeoutMultiplier=2;
commtimeouts.WriteTotalTimeoutConstant=3;
if (!SetCommTimeouts(hComm,&commtimeouts)) {
CloseHandle(hComm);
MessageBox(0,"com port timeouts error!!","Timeouts Error",MB_OK);
return;
}
請用SetCommTimeouts上網搜尋就有答案
seeing
初階會員


發表:49
回覆:131
積分:41
註冊:2002-11-07

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-05-27 23:34:10 IP:123.110.xxx.xxx 訂閱
感謝大家的回覆,小弟目前是採用兩種做法同時用

一是當資料長度不足,也就是發生斷行,會持續接收,直到資料數夠了才做後續的處理

二是把 ReadIntervalTimeout = 1,調到 20,目前在多數電腦上是沒有發生斷行的情形,還要再觀察看看

謝謝大家
yachu721
初階會員


發表:51
回覆:98
積分:44
註冊:2003-07-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-07-17 14:07:53 IP:218.162.xxx.xxx 訂閱
您好

我是 http://delphi.ktop.com.tw/board.php?cid=168&fid=917&tid=81098 的yachu721

到最後我是使用以下網址的控件
斷行幾乎就都沒有發生了
反應也比較靈敏
提供個小意見

http://www.cppfans.com/articles/victorvcl/index.asp
系統時間:2024-11-23 5:03:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!