rs232解封包的問題 |
尚未結案
|
jeffy84123
一般會員 發表:1 回覆:0 積分:0 註冊:2009-09-11 發送簡訊給我 |
我寫了一個程式想要接收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_ButtonClick(TObject *Sender); void __fastcall PCTest_TimerTimer(TObject *Sender); void __fastcall RXStart_TimerTimer(TObject *Sender); void __fastcall RXStart_ButtonClick(TObject *Sender); void __fastcall RXStop_ButtonClick(TObject *Sender); void __fastcall SerialPortSet_ButtonClick(TObject *Sender); void __fastcall SerialPortTest_ButtonClick(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); void __fastcall MainForm(void); void __fastcall InitialForm(void); //RS232 AnsiString RS232TXString; char *RS232TXBuf; char RS232RXBuf[128]; bool blRS232Open; //RS232 driver for RS232.cpp AnsiString sCOMPort_1; double dBaudRate_1; BYTE bParity_1; BYTE bByteSize_1; BYTE bStopBits_1; }; //-----------------------------------------------------------------接收RS232部分 void __fastcall TRS232::RS232_Open(void) { char *ComNo; DCB dcb; AnsiString Temp; if ( Form1->blRS232Open ) //RS232 have open { Form1->blRS232Open=0; 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 發送簡訊給我 |
|
jcjroc
高階會員 發表:21 回覆:279 積分:115 註冊:2002-09-18 發送簡訊給我 |
|
tcSweey
一般會員 發表:7 回覆:19 積分:15 註冊:2005-01-04 發送簡訊給我 |
你好,我覺得232的接收是你要自行去把資料還原的,例如送的字串如果是ASCII 的格式,一般定義是
: 站號 function code 位址 長度 : 01 03 0001 0002 CRC check sum 例如上位機傳送 :010300010002XX 而從機回應的是 :01031234XX 而你收訊息的時間要是剛好落在從機正在回應的時候時,就有可能收到解決的方式可以估算Sensor 回送的時間,你延遲之後再發送,但這樣仍有風險,而且不是很好的寫法,最好是你固定時間去收封包,再把封包還原比較好。 |
foreman
高階會員 發表:3 回覆:124 積分:190 註冊:2004-09-10 發送簡訊給我 |
|
2007
中階會員 發表:54 回覆:90 積分:98 註冊:2008-08-12 發送簡訊給我 |
你好:
可以參考這一篇 看看~~ http://delphi.ktop.com.tw/board.php?cid=31&fid=97&tid=95989 ===================引 用 jeffy84123 文 章=================== 我寫了一個程式想要接收sensor傳來的封包 封包格式是tinyos的格式 可是都接不完全 有一半的封包都不見了 想請問我那裏寫錯呢? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |