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

在 RS232接收byte型態的資訊

尚未結案
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-26 00:13:08 IP:218.168.xxx.xxx 未訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-26 09:21:45 IP:59.104.xxx.xxx 未訂閱
先了解什麼叫 9600,N,8,1. 之後再來看你的問題。 然後再了解什麼叫通訊協定。 一個講中文一個講英文會通嗎? 一個用 9600,N,8,1. 在傳送。 一個要用 9600,N,7,1 來接收。 這會對嗎?
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-26 11:25:12 IP:218.168.xxx.xxx 未訂閱
引言: 先了解什麼叫 9600,N,8,1. 之後再來看你的問題。 然後再了解什麼叫通訊協定。 一個講中文一個講英文會通嗎? 一個用 9600,N,8,1. 在傳送。 一個要用 9600,N,7,1 來接收。 這會對嗎?
你是說?? WriteFile(hComm,&_tdata,1, &lrc, NULL); //一次輸出1個byte 以7個bit的資料位元傳送該怎麼改寫? 不太了解你所說的...可不可以進一步提示嗎 ?
暗黑破壞神
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-26 13:03:36 IP:59.104.xxx.xxx 未訂閱
http://www.camiresearch.com/Data_Com_Basics/RS232_standard.html http://www.arcelect.com/rs232.htm 去讀一讀吧。 http://www.mcu51.com/list.asp?id=1588 想想別人怎麼學,我們有這麼用心嗎? 憂心啊~~~~~~

版主


發表:261
回覆:2302
積分:1667
註冊:2005-01-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-26 13:15:50 IP:211.22.xxx.xxx 未訂閱
傳送端與接收端通訊協定不一樣當然會出現錯誤. dcb.ByteSize =7;=>要能正確動作,除非傳送端也改成一樣.
------
-------------------------------------------------------------------------
走是為了到另一境界,停是為了欣賞人生;未走過千山萬水,怎知生命的虛實與輕重!?
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-26 19:39:39 IP:61.216.xxx.xxx 未訂閱
很感激兩位版主的討論,提供的連結也看過了    抱歉....無意冒犯, 就兩位版主所言:"然後再了解什麼叫通訊協定。 一個講中文一個講英文會通嗎?一個用 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-26 19:49:53 IP:61.216.xxx.xxx 未訂閱
附加說明一點 這個程式將透過一條9PIN RS232 Tx和Rx相連戶接 也就是說訊息的傳送都是同一台電腦 難道送char 可以? byte就不行 dcb.ByteSize =7;=>要能正確動作,除非傳送端也改成一樣???? 就第一篇po文的程式,可否提供版主大人的程式寫法或想法呢? 發表人 - plihui 於 2005/09/26 19:57:13
derrenbol1
中階會員


發表:5
回覆:113
積分:93
註冊:2004-12-09

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-26 20:31:25 IP:210.202.xxx.xxx 未訂閱
To plihui : 我有個問題, 為何您在第一次程式碼中時所傳送的 字元是0xfa, 而第二次您post的程式中傳的是'a' ? 這差滿多的哦(在7-bit的傳輸條件下), 所以我覺得 不是byte跟char之間的問題. 請參考.
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-26 20:55:25 IP:218.168.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-26 21:09:52 IP:210.202.xxx.xxx 未訂閱
To plihui: 嗯. 這樣吧, 前面兩位版主的意思是說您兩端 的設定不一樣, 所以傳輸上會有問題. 當然這個 是一定的, 這個我想您不會不知道吧 ? 假設您 兩端的系統都是相同的設定(9600, 7, N, 1)的 話, 於第一次您的程式中所傳送的是0xFA(請見 Button2Click函數), 您的資料中第七個位元為 1(0b11111010 = 0xFA), 所以在7位元傳輸下, 接收端應只收到0x7a而已; 第二次程式中, 您 在Button3Click中的傳送資料為0x61, 所以沒 這個問題. 請參考.
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-09-26 21:18:53 IP:218.168.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-09-26 21:28:43 IP:210.202.xxx.xxx 未訂閱
To plihui:      ???   因為
plihui
初階會員


發表:88
回覆:96
積分:41
註冊:2003-07-03

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-09-26 21:49:58 IP:218.168.xxx.xxx 未訂閱
可以請教多一點嗎? ”9600,N,7,1”相關知識 尤其是dcb.ByteSize相關的 這個7 為什麼會影響0xfa這個值 難道說在這個設定之下 第7個bit為1的data都註定會錯誤嗎? 該如何修正呢?
暗黑破壞神
版主


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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-09-27 08:44:21 IP:59.104.xxx.xxx 未訂閱
引言: 可以請教多一點嗎? ”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 這樣你懂了沒有?????
系統時間:2024-04-20 15:45:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!