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

請問用BCB撰寫RS-232通訊埠,在Kylix3.0 for Linux中...

尚未結案
win5858
一般會員


發表:11
回覆:1
積分:2
註冊:2003-03-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-05 16:28:59 IP:210.71.xxx.xxx 未訂閱
請問用BCB撰寫RS-232通訊埠,在Kylix3.0 for Linux是否可執行.... 若否!有何方法作.... 請各位高手幫忙 ... 小弟感激不禁...
william
版主


發表:66
回覆:2535
積分:3048
註冊:2002-07-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-31 15:06:01 IP:147.8.xxx.xxx 未訂閱
此為懸賞題  href="http://sourceforge.net/projects/tpaproclx/">http://sourceforge.net/projects/tpaproclx/
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-31 15:21:27 IP:61.218.xxx.xxx 未訂閱
引言: 此為懸賞題 href="http://sourceforge.net/projects/tpaproclx/">http://sourceforge.net/projects/tpaproclx/
william兄: 懸賞題是由系統自動發出的,如問題在一定時間內未得到任何回覆,系統立即產生懸賞題! 聯盟----Visita網站http://www.vista.org.tw ---[ 發問前請先找找舊文章 ]---
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-31 17:58:42 IP:202.39.xxx.xxx 未訂閱
這兒有一篇: http://home.kimo.com.tw/bruce0211/Kylix/trial/comport.txt 轉貼如下: {     Kylix Delphi 版 讀寫 ComPort 範例     0.此範例完整原始檔案下載位置 ftp://members.aol.com/db1joe/kyserex.zip 1.以檔案觀念讀寫 ComPort  2.使用時要將 /dev/ttyS0 讀寫權限開放 (使用指令 chmod 777 /dev/ttyS0 ) 3.真正的應用上 , 要用多執行緒去不停的讀 ComPort , 此範例用 Timmer 去讀 ComPort     }    
unit comtest1;
{    15.05.2001: Funktioniert, fgt jedoch bei jedem Lesevorgang ein
            Linefeed hinzu.
23.05.2001: fixed
}
   
interface
   
uses
  SysUtils, Types, Classes, Variants, QGraphics, QControls,
  QForms, QDialogs, QStdCtrls, LibC, QTypes, QExtCtrls;
   
type
  TForm1 = class(TForm)
    OpenButton: TButton;
    CloseButton: TButton;
    WriteButton: TButton;
    ReadButton: TButton;
    Box: TListBox;
    ReadLabel: TLabel;
    WriteEdit: TEdit;
    WritelnButton: TButton;
    OpenLabel: TLabel;
    EndButton: TButton;
    WriteLabel: TLabel;
    Timer: TTimer;
    procedure OpenButtonClick(Sender: TObject);
    procedure CloseButtonClick(Sender: TObject);
    procedure WriteButtonClick(Sender: TObject);
    procedure ReadButtonClick(Sender: TObject);
    procedure WritelnButtonClick(Sender: TObject);
    procedure EndButtonClick(Sender: TObject);
    procedure TimerTimer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
    serFileTx, comfd:integer;
    ss: string;
  end;
   
var
  Form1: TForm1;
   
implementation
   
{$R *.xfm}
   
{
Button1 intialized the port
Button2 Close the port
Button3 write the string to the port
}
   
{-----開啟 COM1 通訊埠 (重點 !!)---------------------------------------------}
procedure TForm1.OpenButtonClick(Sender: TObject);
var ios:  termios;
begin
  serFileTx:= LibC.Open ('/dev/ttyS0',fmOpenReadWrite or o_nonblock);
  tcgetattr (serFileTx,ios);
  cfmakeraw (ios);
  cfsetospeed (ios, b115200);
  cfsetispeed (ios,b115200);
  tcsetattr (serFileTx,tcsanow,ios);
  OpenLabel.Caption:= IntToStr (serFileTx)
end;
   
{-----關掉 COM1 通訊埠 ------------------------------------------------------}
procedure TForm1.CloseButtonClick(Sender: TObject);
begin 
  fileClose(serFileTx);
  OpenLabel.Caption:= '' 
end;
   
{-----寫入資料至 COM1 通訊埠 ------------------------------------------------}
procedure TForm1.WriteButtonClick(Sender: TObject);
var d:string; resultat: integer;
begin
  d:= WriteEdit.Text;  {WriteEdit 只不過是畫面上的一個 Edit 元件 }
  resultat:= FileWrite (serFileTx, d[1], Length(d));
  WriteLabel.Caption:= IntToStr (resultat)
end;
   
{-----寫入資料至 COM1 通訊埠 ( 有加 CHR(13) )--------------------------------}
procedure TForm1.WritelnButtonClick(Sender: TObject);
var d: string; resultat: integer;
begin
  d:= WriteEdit.Text   #13;
  resultat:= FileWrite (serFileTx, d[1], Length(d));
  WriteLabel.Caption:= IntToStr (resultat)
end;
   
{$O-}
   
{-----讀出 COM1 通訊埠資料 --------------------------------------------------}
procedure TForm1.ReadButtonClick(Sender: TObject);
var a:       array [1..4096] of char;
    s:       string;
    zaehler, index: integer;
begin
  s:= '';
  zaehler:= FileRead (serFileTx, a, sizeof (a));
  ReadLabel.Caption:= IntToStr (zaehler);
    if zaehler > 0
    then begin
           for index:= 1 to zaehler do
             s:= s   a [index];
           Box.Items.Text:= s
         end
end;
   
{$O }
   
{-----結束程式 -------------------------------------------------------------}
procedure TForm1.EndButtonClick(Sender: TObject);
begin
  Application.Terminate
end;
   
   
{-----計時器(InterVal=100)不停去讀出 COM1 通訊埠資料------------------------}
procedure TForm1.TimerTimer(Sender: TObject);
begin
  ReadButtonClick(Sender)
end;
   
end.
--- Have you ever wondered what it would be like? 發表人 - hagar 於 2003/03/31 18:00:42
wb3599
一般會員


發表:32
回覆:32
積分:12
註冊:2004-02-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-02-23 20:26:35 IP:61.230.xxx.xxx 未訂閱
在uses中, 有一個LibC的程式單元, 這要到那裡找呢? 因為我編譯不過! Thanks
piopoip
一般會員


發表:8
回覆:8
積分:13
註冊:2002-08-26

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-24 20:20:30 IP:218.168.xxx.xxx 未訂閱
請參考 serial program howto http://www.tldp.org/HOWTO/Serial-Programming-HOWTO/    也是使用讀寫檔案方式使用RS232 把Asynchronous Input(使用SIGNAL)的範例拿來編譯即可 以下簡單解釋          #include  #include #include #include #include #include #define BAUDRATE B38400 //定義BAUDRATE #define MODEMDEVICE "/dev/ttyS1" //開啟那一個port #define _POSIX_SOURCE 1 /* POSIX compliant source */ #define FALSE 0 #define TRUE 1 volatile int STOP=FALSE; void signal_handler_IO (int status); /* definition of signal handler */ int wait_flag=TRUE; /* TRUE while no signal received */ main() { int fd,c, res; struct termios oldtio,newtio; struct sigaction saio; /* definition of signal action */ char buf[255]; fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK); //開port 使用 NONNBLOCK (參數定義請man termios) if (fd <0) {perror(MODEMDEVICE); exit(-1); } /* install the signal handler before making the device asynchronous */ saio.sa_handler = signal_handler_IO; saio.sa_mask = 0; saio.sa_flags = 0; saio.sa_restorer = NULL; sigaction(SIGIO,&saio,NULL); /* allow the process to receive SIGIO */ fcntl(fd, F_SETOWN, getpid()); /* Make the file descriptor asynchronous (the manual page says only O_APPEND and O_NONBLOCK, will work with F_SETFL...) */ fcntl(fd, F_SETFL, FASYNC); tcgetattr(fd,&oldtio); /* save current port settings */ /* set new port settings for canonical input processing */ newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; newtio.c_iflag = IGNPAR; //忽略parity check error newtio.c_cc[VMIN]=1; //block 直到1個字元才收入 newtio.c_cc[VTIME]=0; //block的Timeout時間 tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); //將參數寫入 /* loop while waiting for input. normally we would do something useful here */ while (STOP==FALSE) { printf(".\n");usleep(100000); /* after receiving SIGIO, wait_flag = FALSE, input is available and can be read */ if (wait_flag==FALSE) { res = read(fd,buf,255); //實際讀取通訊埠 buf[res]=0; printf(":%s:%d\n", buf, res); if (res==1) STOP=TRUE; /* stop loop if only a CR was input */ wait_flag = TRUE; /* wait for new input */ } } /* restore old port settings */ tcsetattr(fd,TCSANOW,&oldtio); } /*************************************************************************** * signal handler. sets wait_flag to FALSE, to indicate above loop that * * characters have been received. * ***************************************************************************/ void signal_handler_IO (int status) //當RS232有訊號就會驅動這個function,上面while迴圈中的開關就會打開,就會read { printf("received SIGIO signal.\n"); wait_flag = FALSE; } 這是使用Asynchronous Input讀RS232 但是一個thread只能控制一個RS232 如果你要在一個thread中控制多個埠 就要使用最後一個範例-select()
系統時間:2024-11-21 18:32:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!