此為轉貼資料 http://netcity3.web.hinet.net/userdata/k1228341/art/bcb232.txt ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Subject: 在Win32[BCB]下用Serial Port通訊的範例 發信人: vega6385.bbs@cszone.twbbs.org (simayi), 信區: programming
標 題: 在Win32[BCB]下用Serial Port通訊的範例
發信站: 程式設計樂園(CSZone) (Thu Jul 27 21:16:13 2000)
轉信站: cis_nctu!news.cis.nctu!freebsd.ntu!news.ntu!CSZone
來 源: octa2.ee.ntu.edu.tw 在Win32[BCB]下用Serial Port通訊的範例
///////////////////////////////////////////////
下列的程式示範了如何在Win32下
用console mode做Serial Port通訊
關於與之通訊的硬體,請參考松崗
出版的"單晶片8051實務<增修版>"
一書,作者:吳一農,ISBN:957-22-3242-8
硬體線路及8051ASM CODE.請參照
書中第16章的部份.本程式能完全取代
16-19頁中的Qbasic程式,達到雙向傳輸的功用.
本程式在BCB5中能順利編譯執行!! #include
#include
#include
int main(int argc, char* argv[])
{
HANDLE com2_handle ; //RS-232的Com2的handle
DCB dcb ; //設定傳輸參數所需之結構
char buffer[10]; //讀取資料所需的緩衝區 DWORD read_bytes = 1 ; //每次讀取的byte數 com2_handle = CreateFile( "COM2" ,GENERIC_READ|GENERIC_WRITE ,
0, NULL ,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
//開啟com2,設為一般讀取寫入,一般屬性,不使用非同步IO BuildCommDCB( "baud=4800 parity=N data=8 stop=2", &dcb );
//設定傳輸參數結構的內含值:鮑率:4800,無同位檢查,資料位元8,停止位元2 SetCommState( com2_handle , &dcb );
//設定傳輸參數 COMMTIMEOUTS time_out ; //設定讀寫逾時參數的結構
time_out.ReadIntervalTimeout = MAXDWORD ;
//設為MAXDWORD:如果沒有資料供讀取,ReadFile函式將立即返回
time_out.ReadTotalTimeoutMultiplier = 0 ;
time_out.ReadTotalTimeoutConstant = 0 ;
//不使用讀取總和時間來判斷是否讀取逾時
time_out.WriteTotalTimeoutMultiplier = 5 ;
time_out.WriteTotalTimeoutConstant = 50 ;
//使用寫入總和時間來判斷是否寫入逾時,逾時WriteFile函式將立即返回 SetCommTimeouts( com2_handle , &time_out ) ;
//設定com2讀寫逾時返回 printf("請撥動switch然後接收 或 按數字鍵0~9傳輸 或 可以按X結束\n"); while( 1 )
{ ReadFile( com2_handle , buffer , read_bytes ,&read_bytes ,NULL); //由com2讀取1byte //因為ReadFile函式逾時的時候,不僅沒讀到資料(所以buffer[0]沒變動)就返回,
//還會把read_bytes內含值改為0,因此read_bytes!= 0時表示有讀到資料 if(read_bytes!= 0)
{
//下面這一段顯示四個switch的狀態,用1與0表示ON/OFF
//方法是有點拙,我也知道用<<和>>很快,可是實作時出了點狀況,所以用這個拙方法
int sw1,sw2,sw3,sw4 ;
sw1 = (0-buffer[0]-113) / 8 ;
sw2 = ((0-buffer[0]-113)- (sw1 * 8)) / 4 ;
sw3 = ((0-buffer[0]-113)-(sw1*8)-(sw2*4)) / 2 ;
sw4 = ((0-buffer[0]-113)-(sw1*8)-(sw2*4)-(sw3*2)) / 1 ;
printf("由COM2得到Switch狀態 %d%d%d%d \n", sw1,sw2,sw3,sw4);
printf("可以按X結束\n"); }
else
{
read_bytes = 1 ;
//因為ReadFile函式逾時的時候,不僅沒讀到資料(所以buffer[0]沒變動)就返回,
//還會把read_bytes內含值改為0,所以我們要設回初值,不然下一輪會讀不到資料
//(因為內函值為0,表示要讀取0byte,所以讀不到資料)
} if( kbhit() != 0 ) //如果鍵盤有被按到,kbhit函式傳回值不等於0
{
int key ; //存放被按的鍵的鍵值
key = getch() ; //把被鍵值讀出來
if( key == 'x' )
{
break ; //按下小寫x結束本程式
}
else
{
switch( key ) //如果輸入數字鍵0~9,將之傳給8051實習板顯示出來
{
case '0' : WriteFile( com2_handle , &key , read_bytes ,
&read_bytes ,NULL );
printf("傳送%c到UART的另一端\n",key);
printf("可以按X結束\n");
break ;
case '1' : WriteFile( com2_handle , &key , read_bytes ,
&read_bytes ,NULL );
printf("傳送%c到UART的另一端\n",key);
printf("可以按X結束\n");
break ;
case '2' : WriteFile( com2_handle , &key , read_bytes ,
&read_bytes ,NULL );
printf("傳送%c到UART的另一端\n",key);
printf("可以按X結束\n");
break ;
case '3' : WriteFile( com2_handle , &key , read_bytes ,
&read_bytes ,NULL );
printf("傳送%c到UART的另一端\n",key);
printf("可以按X結束\n");
break ;
case '4' : WriteFile( com2_handle , &key , read_bytes ,
&read_bytes ,NULL );
printf("傳送%c到UART的另一端\n",key);
printf("可以按X結束\n");
break ;
case '5' : WriteFile( com2_handle , &key , read_bytes ,
&read_bytes ,NULL );
printf("傳送%c到UART的另一端\n",key);
printf("可以按X結束\n");
break ;
case '6' : WriteFile( com2_handle , &key , read_bytes ,
&read_bytes ,NULL );
printf("傳送%c到UART的另一端\n",key);
printf("可以按X結束\n");
break ;
case '7' : WriteFile( com2_handle , &key , read_bytes ,
&read_bytes ,NULL );
printf("傳送%c到UART的另一端\n",key);
printf("可以按X結束\n");
break ;
case '8' : WriteFile( com2_handle , &key , read_bytes ,
&read_bytes ,NULL );
printf("傳送%c到UART的另一端\n",key);
printf("可以按X結束\n");
break ;
case '9' : WriteFile( com2_handle , &key , read_bytes ,
&read_bytes ,NULL );
printf("傳送%c到UART的另一端\n",key);
printf("可以按X結束\n");
break ;
default: break ;
} }
} } CloseHandle( com2_handle ); //關閉com2
return 0; } ///////////////////////////////////
改寫成BCB的版本如下
/////////////////////////////////// //--------------------------------------------------------------------------- #include
#pragma hdrstop #include "uart_GUI_cpp.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#include
TForm1 *Form1;
HANDLE com2_handle ; //RS-232的Com2的handle
DCB dcb ; //設定傳輸參數所需之結構
char buffer[10]; //讀取資料所需的緩衝區
DWORD read_bytes = 1 ; //每次讀取的byte數
COMMTIMEOUTS time_out ; //設定讀寫逾時參數的結構
int key ; //存放被按的鍵的鍵值
char temp_string[256];
char temp_string2[256]; //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormResize(TObject *Sender)
{
Width = 435 ;
Height = 300 ;
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button11Click(TObject *Sender)
{
Form1->Close();
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender)
{ com2_handle = CreateFile( "COM2" ,GENERIC_READ|GENERIC_WRITE ,
0, NULL ,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
//開啟com2,設為一般讀取寫入,一般屬性,不使用非同步IO BuildCommDCB( "baud=4800 parity=N data=8 stop=2", &dcb );
//設定傳輸參數結構的內含值:鮑率:4800,無同位檢查,資料位元8,停止位元2 SetCommState( com2_handle , &dcb );
//設定傳輸參數 time_out.ReadIntervalTimeout = MAXDWORD ;
//設為MAXDWORD:如果沒有資料供讀取,ReadFile函式將立即返回
time_out.ReadTotalTimeoutMultiplier = 0 ;
time_out.ReadTotalTimeoutConstant = 0 ;
//不使用讀取總和時間來判斷是否讀取逾時
time_out.WriteTotalTimeoutMultiplier = 5 ;
time_out.WriteTotalTimeoutConstant = 50 ;
//使用寫入總和時間來判斷是否寫入逾時,逾時WriteFile函式將立即返回 SetCommTimeouts( com2_handle , &time_out ) ;
//設定com2讀寫逾時返回
Memo1->Clear();
Memo2->Clear();
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender)
{
key = '1';
sprintf(temp_string,"%c",key);
Memo1->Clear();
Memo1->SetSelTextBuf(temp_string);
WriteFile( com2_handle , &key , read_bytes , &read_bytes ,NULL );
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender)
{
key = '2';
sprintf(temp_string,"%c",key);
Memo1->Clear();
Memo1->SetSelTextBuf(temp_string);
WriteFile( com2_handle , &key , read_bytes , &read_bytes ,NULL );
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button10Click(TObject *Sender)
{
key = '0';
sprintf(temp_string,"%c",key);
Memo1->Clear();
Memo1->SetSelTextBuf(temp_string);
WriteFile( com2_handle , &key , read_bytes , &read_bytes ,NULL );
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button3Click(TObject *Sender)
{
key = '3';
sprintf(temp_string,"%c",key);
Memo1->Clear();
Memo1->SetSelTextBuf(temp_string);
WriteFile( com2_handle , &key , read_bytes , &read_bytes ,NULL );
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender)
{
key = '4';
sprintf(temp_string,"%c",key);
Memo1->Clear();
Memo1->SetSelTextBuf(temp_string);
WriteFile( com2_handle , &key , read_bytes , &read_bytes ,NULL );
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button5Click(TObject *Sender)
{
key = '5';
sprintf(temp_string,"%c",key);
Memo1->Clear();
Memo1->SetSelTextBuf(temp_string);
WriteFile( com2_handle , &key , read_bytes , &read_bytes ,NULL );
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button6Click(TObject *Sender)
{
key = '6';
sprintf(temp_string,"%c",key);
Memo1->Clear();
Memo1->SetSelTextBuf(temp_string);
WriteFile( com2_handle , &key , read_bytes , &read_bytes ,NULL );
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button7Click(TObject *Sender)
{
key = '7';
sprintf(temp_string,"%c",key);
Memo1->Clear();
Memo1->SetSelTextBuf(temp_string);
WriteFile( com2_handle , &key , read_bytes , &read_bytes ,NULL );
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button8Click(TObject *Sender)
{
key = '8';
sprintf(temp_string,"%c",key);
Memo1->Clear();
Memo1->SetSelTextBuf(temp_string);
WriteFile( com2_handle , &key , read_bytes , &read_bytes ,NULL );
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Button9Click(TObject *Sender)
{
key = '9';
sprintf(temp_string,"%c",key);
Memo1->Clear();
Memo1->SetSelTextBuf(temp_string);
WriteFile( com2_handle , &key , read_bytes , &read_bytes ,NULL );
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
CloseHandle( com2_handle );
}
//--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false; ReadFile( com2_handle , buffer , read_bytes ,&read_bytes ,NULL); //由com2讀取1byte if(read_bytes!= 0)
{
//下面這一段顯示四個switch的狀態,用1與0表示ON/OFF
//方法是有點拙,我也知道用<<和>>很快,可是實作時出了點狀況,所以用這個拙方法
int sw1,sw2,sw3,sw4 ;
sw1 = ((0-buffer[0]-113) & 8)/8 ;
sw2 = ((0-buffer[0]-113) & 4)/4 ;
sw3 = ((0-buffer[0]-113) & 2)/2 ;
sw4 = ((0-buffer[0]-113) & 1)/1 ;
sprintf(temp_string2,"由COM2得到Switch狀態 %d%d%d%d \n", sw1,sw2,sw3,sw4); Memo2->Clear();
Memo2->SetSelTextBuf(temp_string2);
while(read_bytes!= 0)//把緩衝區資料全讀完才跳出
{
ReadFile( com2_handle , buffer , read_bytes ,&read_bytes ,NULL); //由com2讀取1byte
sw1 = ((0-buffer[0]-113) & 8)/8 ;
sw2 = ((0-buffer[0]-113) & 4)/4 ;
sw3 = ((0-buffer[0]-113) & 2)/2 ;
sw4 = ((0-buffer[0]-113) & 1)/1 ;
sprintf(temp_string2,"由COM2得到Switch狀態 %d%d%d%d \n", sw1,sw2,sw3,sw4); Memo2->Clear();
Memo2->SetSelTextBuf(temp_string2);
}
read_bytes = 1 ;
//因為ReadFile函式逾時的時候,不僅沒讀到資料(所以buffer[]沒變動)就返回,
//還會把read_bytes內含值改為0,所以我們要設回初值,不然下一輪會讀不到資料
//(因為內函值為0,表示要讀取0byte,所以讀不到資料)
}
else
{
read_bytes = 1 ;
//因為ReadFile函式逾時的時候,不僅沒讀到資料(所以buffer[]沒變動)就返回,
//還會把read_bytes內含值改為0,所以我們要設回初值,不然下一輪會讀不到資料
//(因為內函值為0,表示要讀取0byte,所以讀不到資料)
} Timer1->Enabled = true;
}
//--------------------------------------------------------------------------- --
*********************************************
* Simayi司馬仲達 simayi@kimo.com.tw ? *
* CICQ : 663287 ICQ : 49827636 *
* 歡迎大家一起討論程式設計的問題 *
* C/C OWL ASM QB都可以討論喔!! *
********************************************* --
※ Origin: 程式設計樂園 ◆ From: h117.s170.ts32.hinet.net *********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好 Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind to make knowledge together!
希望能大家敞開心胸,將知識寶庫結合一起
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好
Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind