全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3122
推到 Plurk!
推到 Facebook!

請問用BCB來接收8051資料.

尚未結案
jerichowang
一般會員


發表:17
回覆:27
積分:8
註冊:2005-07-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-11-19 00:48:32 IP:140.114.xxx.xxx 未訂閱
小弟我用8051送出一個8bit的資料譬如說0x41..透過max232接到RS232連到電腦 用以下的程式做接收...但是收到的都是中文亂碼,同理,再BCB端送出一個值 譬如說A,顯示在8051的port上面的LED燈號也是錯的(正確應該是01000001,的ASCII 65),送其他ASCII對應的值和符號,兩者之間傳送和接收的資料顯示也皆是錯的,我兩邊都是用 9600 N 8 1 來使用,所以我用示波器量8051串列輸出腳,是10bit沒錯...且扣掉頭尾的起始和結束位元資料沒錯(01000001),8051透過本身串列腳自送自收在顯示在燈號上的結果也沒錯,感覺似乎是我PC端BCB程式的問題...    可以幫我看一下嗎,需要再怎麼改才能做到我從8051送出的0x41資料 再BCB端接收到的是正確的A字元呢    需要再怎麼改才能做到我從BCB送出的"A"字元 再8051端接收到的是正確的A字元(0x41 01000001)呢    謝謝大家     
#include 
#pragma hdrstop    #include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HANDLE hComm;
boolean DTRState;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::openClick(TObject *Sender)
{
char* comno;
DCB dcb;
String temp;
temp="Com" IntToStr(rdCOM->ItemIndex 1);
comno=temp.c_str();
hComm=CreateFile(comno,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
if(hComm==INVALID_HANDLE_VALUE)
{
 MessageBox(0,"Comm error","通訊錯誤",MB_OK);
 return;
}
 GetCommState(hComm,&dcb);
 dcb.BaudRate=CBR_9600;
 dcb.ByteSize=8;
 dcb.Parity=NOPARITY;
 dcb.StopBits=ONESTOPBIT;
 if(!SetCommState(hComm,&dcb))
 {
      MessageBox(0,"Comm error","通訊錯誤",MB_OK);
       CloseHandle(hComm);
       return;
 }
   if(!SetupComm(hComm,2,2))
        {
          MessageBox(0,"Comm error","通訊錯誤",MB_OK);
          CloseHandle(hComm);
          return;           }        EscapeCommFunction(hComm,CLRDTR);       }
   //---------------------------------------------------------------------------
void __fastcall TForm1::sendClick(TObject *Sender)
{
 String temp;     int in;
 unsigned long lrc,BS;
 if(hComm==0)
 return;
 temp= Msend->Text;
 BS=temp.Length();      char *senddata;
  senddata=temp.c_str();
  cbiq->Text=(BS);
  WriteFile(hComm,&buffer,1,&lrc,NULL);
}
//-------------------------------------------------------------------
void __fastcall TForm1::RECIEVEClick(TObject *Sender)
{
      DCB dcb;
         String temp;
char inbuff[496000];
DWORD nBytestRead,dwEvent,dwError;
COMSTAT cs;
ClearCommError(hComm,&dwError,&cs);
GetCommState(hComm,&dcb);    if(cs.cbInQue>sizeof(inbuff))
{
 PurgeComm(hComm,PURGE_RXCLEAR);
 return;
}
 ReadFile(hComm,inbuff,cs.cbInQue,&nBytestRead,NULL);
 inbuff[cs.cbInQue]='\0';
 mrecive->Text=mrecive->Text inbuff;    }
//------------------------------------------------------------------         
暗黑破壞神
版主


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-11-19 14:17:01 IP:59.104.xxx.xxx 未訂閱
去 google 查一下 asyncpro 然後找來下載安裝 之後看它的說明文件。 利用它的元件來送跟收。 另。 建議你在完全不知道狀況時。 讓你的 51 一直送 'A' 讓你的PC來收。 這樣你可以比較快了解問題出在那邊。
jerichowang
一般會員


發表:17
回覆:27
積分:8
註冊:2005-07-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-11-20 11:27:06 IP:140.114.xxx.xxx 未訂閱
你好... 還有一點令我很好奇的是...為何電腦端的RS232送出的串列波型都是一樣的 不管我 送什麼字元,大小多大...他的波型總是 _ _ __ 1 |_| |______| 0 ,這波型是由電腦端的RS232送出後經過max232,在送入8051之前量得的..同樣的若是直接量測RS232的 TXD接腳對地接腳,波型也是都相同,只是他不是像8051的TTL電位而已,但是8051送出之串列資料,的確資料的值不同波型也就不同,8051版子是別公司出的模組,電路不會有問題,兩台電腦之間透過RS232我已經確定可以傳送正確字元...但是既然RS232 TXD對地的資料波型皆相同,那麼她們是如何分辨資料的呢 謝謝
暗黑破壞神
版主


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-11-21 09:10:19 IP:59.104.xxx.xxx 未訂閱
引言: 為何電腦端的RS232送出的串列波型都是一樣的
小心比對。你會發現不一樣啦。 總寬度會一樣。 可是波型會不同。
系統時間:2017-10-21 14:41:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!