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

rs232解封包的問題

尚未結案
jeffy84123
一般會員


發表:1
回覆:0
積分:0
註冊:2009-09-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-09-20 21:40:01 IP:61.59.xxx.xxx 訂閱
我寫了一個程式想要接收sensor傳來的封包
封包格式是tinyos的格式
可是都接不完全
有一半的封包都不見了
想請問我那裏寫錯呢?
///-----------------------------------------------------------宣告部份
class TForm1 : public TForm
{
__published: // IDE-managed Components
TPageControl *PageControl1;
TTabSheet *TabSheet1;
TGroupBox *GroupBox1;
TLabel *Label1;
TLabel *Label2;
TEdit *RX_Edit;
TEdit *TX_Edit;
TButton *PCTXStart_Button;
TGroupBox *GroupBox2;
TButton *RXStart_Button;
TListBox *Received_ListBox;
TTimer *PCTest_Timer;
TTimer *RXStart_Timer;
TButton *RXStop_Button;
TButton *SerialPortSet_Button;
TButton *SerialPortTest_Button;
void __fastcall PCTXStart_Butt0;
CloseHandle(hComm);
}
//轉換至指標型態Char
ComNo = Form1->sCOMPort_1.c_str();
hComm = CreateFile(ComNo,GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, 0);
if (hComm == INVALID_HANDLE_VALUE) // 如果COM 未開啟
{
MessageBox(NULL, "開啟通訊埠錯誤!!","ERROR",MB_OK);
CloseHandle(hComm);
return;
}
//將dcb位址傳入,以取得通訊參數
GetCommState(hComm,&dcb); //得知目前COM 的狀態
dcb.BaudRate = Form1->dBaudRate_1; //Set BaudRate
dcb.Parity = Form1->bParity_1; //Set Parity
dcb.ByteSize = Form1->bByteSize_1; //Set Data Bit
dcb.StopBits = Form1->bStopBits_1; //Set Stop bit
//通訊埠設定
if (!SetCommState(hComm, &dcb)) //設定COM 的狀態
{
MessageBox (NULL, "通訊埠設定錯誤!!","ERROR",MB_OK);
CloseHandle(hComm);
return;
}
}
//---------------------------------------------------------------------------
void __fastcall TRS232::RS232_Transmission(void)
{
}
//---------------------------------------------------------------------------
void __fastcall TRS232::RS232_Received(void)
{
//String Temp;
//char inbuff[1024];
DWORD nBytesRead, dwEvent, dwError;
COMSTAT cs;
//取得狀態
ClearCommError(hComm,&dwError,&cs);
//資料是否大於我們所準備的Buffer
if (cs.cbInQue > sizeof(Form1->RS232RXBuf))
{
PurgeComm(hComm, PURGE_RXCLEAR); // 清除COM 資料
return;
}
ReadFile(hComm, Form1->RS232RXBuf,cs.cbInQue,&nBytesRead,NULL); // 接收COM 的資料
//陣列中的字串結尾處補上零字元
Form1->RS232RXBuf[cs.cbInQue]= '\0';
}

GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-11-04 14:45:18 IP:220.128.xxx.xxx 未訂閱
難得看到有人用tinyos

你的RS232_Received動作是跑loop,還是只跑一次

你的資料lose是有規律的嗎
jcjroc
高階會員


發表:21
回覆:276
積分:114
註冊:2002-09-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-11-23 09:56:05 IP:59.124.xxx.xxx 訂閱
一,用Event方式等待資料
二.用thread去收資料

tcSweey
一般會員


發表:7
回覆:19
積分:15
註冊:2005-01-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-12-02 15:04:43 IP:60.249.xxx.xxx 訂閱
你好,我覺得232的接收是你要自行去把資料還原的,例如送的字串如果是ASCII 的格式,一般定義是 
: 站號 function code 位址 長度
: 01 03 0001 0002 CRC check sum

例如上位機傳送 :010300010002XX 而從機回應的是 :01031234XX

而你收訊息的時間要是剛好落在從機正在回應的時候時,就有可能收到:010

解決的方式可以估算Sensor 回送的時間,你延遲之後再發送,但這樣仍有風險,而且不是很好的寫法,最好是你固定時間去收封包,再把封包還原比較好。
foreman
高階會員


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-12-03 12:09:01 IP:114.39.xxx.xxx 未訂閱
2007
中階會員


發表:54
回覆:90
積分:98
註冊:2008-08-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-12-03 13:09:55 IP:60.249.xxx.xxx 未訂閱
你好:

可以參考這一篇 看看~~

http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=95989



===================引 用 jeffy84123 文 章===================
我寫了一個程式想要接收sensor傳來的封包
封包格式是tinyos的格式
可是都接不完全
有一半的封包都不見了
想請問我那裏寫錯呢?



編輯記錄
2007 重新編輯於 2009-12-03 13:13:52, 註解 無‧
2007 重新編輯於 2009-12-03 13:15:35, 註解 無‧
系統時間:2017-10-22 3:21:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!