在 RS232接收byte型態的資訊 |
尚未結案
|
plihui
初階會員 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
void __fastcall TForm1::Button1Click(TObject *Sender) { hComm=CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0 ,0); if ( hComm == INVALID_HANDLE_VALUE) { MessageBox(0, "開啟錯誤的通訊阜!!!","錯誤的通訊阜", MB_OK); return; } GetCommState(hComm,&dcb); // 將dcb位置傳入,已設定通訊參數 //設定RS232傳輸速率 dcb.BaudRate = CBR_9600; //設定RS232 傳輸格式 -資料位元 dcb.ByteSize =7; //設定8時..ok!! //^^^^^^^^^^^^^^^<-7error //設定RS232 傳輸格式 -停止位元 dcb.StopBits=ONESTOPBIT; //設定RS232 傳輸格式 -同位元檢查 dcb.Parity=NOPARITY; if( !SetCommState( hComm, &dcb) ) { MessageBox(0, "通訊參數設定失敗", "Setting Error", MB_OK); CloseHandle(hComm); return; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { //輸出命令至HighLander DWORD nBytes_W=1; //nBytes_W:number of bytes to write unsigned long lrc; //pointer to number of bytes written byte _tdata=0xFA; if ( hComm == 0) { MessageBox(NULL,"COM port is not opened!!","OK",MB_OK); return ; } _tdata=StrToInt(Edit1->Text); WriteFile(hComm,&_tdata,1, &lrc, NULL); //一次輸出1個byte } //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { byte in_buff[5000]; DWORD nBytes_R, dwEvent , dwError; COMSTAT cs; //The COMSTAT structure contains information about a communications device. ClearCommError(hComm,&dwError,&cs); // ClearCommError():讀取串列埠現在狀態 //reports the current status of a communications device if(cs.cbInQue > sizeof(in_buff)) { PurgeComm(hComm, PURGE_RXCLEAR); return; } ReadFile(hComm, in_buff, cs.cbInQue, &nBytes_R, NULL); //檢查命令 參數傳遞正確與否 Memo1->Lines->Add("0x" IntToHex(in_buff[0], 2) "\n"); }RS232程式是用來傳送1個byte的指令給機器 在資料位元dcb.ByteSize=8時可正常運作, 但dcb.ByteSize=7,會出現error 想請問大家,到底哪裡出現問題 ? |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
plihui
初階會員 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
㊣
版主 發表:261 回覆:2302 積分:1667 註冊:2005-01-04 發送簡訊給我 |
|
plihui
初階會員 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
很感激兩位版主的討論,提供的連結也看過了 抱歉....無意冒犯,
就兩位版主所言:"然後再了解什麼叫通訊協定。
一個講中文一個講英文會通嗎?一個用 9600,N,8,1. 在傳送。
一個要用 9600,N,7,1 來接收。這會對嗎?"
可是下面以char的例子,顯示確實是ok的....
平平程式一樣,差就差傳送是char 或 byte
想請問大大有何不同?!
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //選擇使用的port: com1 或 com2 char *Com_port; DCB dcb; String Com_name="COM1"; Com_port=Com_name.c_str(); hComm=CreateFile(Com_port, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0 ,0); if ( hComm == INVALID_HANDLE_VALUE) { MessageBox(0, "開啟錯誤的通訊阜!!!","錯誤的通訊阜", MB_OK); return; } // 將dcb位置傳入,已設定通訊參數 GetCommState(hComm,&dcb); dcb.BaudRate = CBR_9600; dcb.ByteSize =7; ^^^ dcb.Parity=NOPARITY; dcb.StopBits=ONESTOPBIT; if( !SetCommState( hComm, &dcb) ) { MessageBox(0, "通訊參數設定失敗", "Setting Error", MB_OK); CloseHandle(hComm); return; } } //-------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { if ( hComm != INVALID_HANDLE_VALUE ) CloseHandle(hComm); exit(EXIT_SUCCESS); } //--------------------------------------------------------------------------- // Button3Click事件主要是處理將Memo1元件上所輸入的字元透過RS232 //輸出 //--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender) { DWORD nBytes_W; //nBytes_W:number of bytes to write unsigned long lrc; //pointer to number of bytes written char a='a'; if ( hComm == 0) return ; WriteFile(hComm,&a,1, &lrc, NULL); ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ } //--------------------------------------------------------------------------- // Button4Click事件主要是處理將接收到的字元透過Memo2元件 //輸出 //--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) { char in_buff[16]; DWORD nBytes_R, dwEvent , dwError; COMSTAT cs; //The COMSTAT structure contains information about a communications device. ClearCommError(hComm,&dwError,&cs); // ClearCommError():讀取串列埠現在狀態 //reports the current status of a communications device if(cs.cbInQue > sizeof(in_buff)) { PurgeComm(hComm, PURGE_RXCLEAR); return; } ReadFile(hComm, in_buff, cs.cbInQue, &nBytes_R, NULL); in_buff[cs.cbInQue]='\0'; Memo2->Lines->Add(in_buff); } //--------------------------------------------------------------------------- |
plihui
初階會員 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
|
derrenbol1
中階會員 發表:5 回覆:113 積分:93 註冊:2004-12-09 發送簡訊給我 |
|
plihui
初階會員 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
引言: To plihui : 我有個問題, 為何您在第一次程式碼中時所傳送的 字元是0xfa, 而第二次您post的程式中傳的是'a' ? 這差滿多的哦(在7-bit的傳輸條件下), 所以我覺得 不是byte跟char之間的問題. 請參考.嗯...我不是很懂你所說的意思耶.. 這樣吧...我改寫一下Button3Click 讓大家易懂吧.. 程式碼1=程式碼2 其實a的byte表示法為0x61... 就是這樣而已... 程式碼1: void __fastcall TForm1::Button3Click(TObject *Sender) { DWORD nBytes_W; //nBytes_W:number of bytes to write unsigned long lrc; //pointer to number of bytes written char a='a'; ShowMessage("0x" IntToHex(a, 2) "\n"); if ( hComm == 0) return ; WriteFile(hComm,&a,1, &lrc, NULL); } 程式碼2: void __fastcall TForm1::Button3Click(TObject *Sender) { DWORD nBytes_W; //nBytes_W:number of bytes to write unsigned long lrc; //pointer to number of bytes written char a=0x61; if ( hComm == 0) return ; WriteFile(hComm,&a,1, &lrc, NULL); }發表人 - plihui 於 2005/09/26 21:03:09 |
derrenbol1
中階會員 發表:5 回覆:113 積分:93 註冊:2004-12-09 發送簡訊給我 |
To plihui: 嗯. 這樣吧, 前面兩位版主的意思是說您兩端
的設定不一樣, 所以傳輸上會有問題. 當然這個
是一定的, 這個我想您不會不知道吧 ? 假設您
兩端的系統都是相同的設定(9600, 7, N, 1)的
話, 於第一次您的程式中所傳送的是0xFA(請見
Button2Click函數), 您的資料中第七個位元為
1(0b11111010 = 0xFA), 所以在7位元傳輸下,
接收端應只收到0x7a而已; 第二次程式中, 您
在Button3Click中的傳送資料為0x61, 所以沒
這個問題. 請參考.
|
plihui
初階會員 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
引言: To plihui: 嗯. 這樣吧, 前面兩位版主的意思是說您兩端 的設定不一樣, 所以傳輸上會有問題. 當然這個 是一定的, 這個我想您不會不知道吧 ? 假設您 兩端的系統都是相同的設定(9600, 7, N, 1)的 話, 於第一次您的程式中所傳送的是0xFA(請見 Button2Click函數), 您的資料中第七個位元為 ^^^^^^^^^^^^^^^^^^^^^^ 1(0b11111010 = 0xFA), ^^^^^^^^^^^^^^^^^^^^ 所以在7位元傳輸下, 接收端應只收到0x7a而已; 第二次程式中, 您 在Button3Click中的傳送資料為0x61, 所以沒 這個問題. 請參考.請問derrenbol1和諸位版友 0xfa->0x7a推導的過程 為什麼0x61沒這各問題呢? 發表人 - plihui 於 2005/09/26 21:23:28 |
derrenbol1
中階會員 發表:5 回覆:113 積分:93 註冊:2004-12-09 發送簡訊給我 |
|
plihui
初階會員 發表:88 回覆:96 積分:41 註冊:2003-07-03 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
引言: 可以請教多一點嗎? ”9600,N,7,1”相關知識 尤其是dcb.ByteSize相關的 這個7 為什麼會影響0xfa這個值 難道說在這個設定之下 第7個bit為1的data都註定會錯誤嗎?7, 8 就是在設定你一個 字 是由幾個 Bits 所構成的。 在早期的電腦用 7 Bits 為一個 Byte 而會用到 8 Bits 是後來才擴充的。 你在傳送跟接收用的不同。 兩邊怎麼去計算你到底是怎麼傳? 一邊只送 7 Bits 到對方。 而對方要收到 8 Bits 才算一個 byte 這樣你懂了沒有????? |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |