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

Rs232通信程式

答題得分者是:piopoip
sigmaccc
一般會員


發表:32
回覆:40
積分:14
註冊:2003-11-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-04 08:33:59 IP:203.204.xxx.xxx 未訂閱
大家好: 小弟用Kylix寫了一個Rs232通信程式,目的是要把ABC這三個字元傳到另一台電腦。但在另一台電腦上卻接收到6個字元,內容為:6,152,24,152,30,152。原始程式如下,請問為何會如此呢?麻煩大家幫幫忙了,thanks a lot. char SendData[3]={ 'A','B','C' }; int fp; struct termios oldtio,newtio; if((fp=open("/dev/ttyS0",O_RDWR|O_NOCTTY))!=-1) // 開啟Com1。 { tcgetattr(fp,&oldtio); // 儲存目前的序列埠設定。 bzero(&newtio, sizeof(newtio)); // 清除結構體以放入新的序列埠設定值。 newtio.c_cflag=B19200 | CRTSCTS | CS8 | CLOCAL | CREAD; // Baudrate:19200 // Data :8 // Parity :None // Stop :1 newtio.c_iflag = IGNPAR; newtio.c_oflag = 0; /* 設定輸入模式 (非標準型, 不回應,...) */ newtio.c_lflag = 0; newtio.c_cc[VTIME] = 0; /* 不使用分割字元組計時器 */ newtio.c_cc[VMIN] = 5; /* 在讀取到 5 個字元前先停止 */ tcflush(fp,TCIFLUSH); // 清除數據機線。 tcsetattr(fp,TCSANOW,&newtio); // 啟動序列埠的設定。 write(fp,SendData,sizeof(SendData)); tcsetattr(fp,TCSANOW,&oldtio); // 回存舊的序列埠設定值 close(fp); // 關閉Com1。 }
sigmaccc
一般會員


發表:32
回覆:40
積分:14
註冊:2003-11-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-04 15:53:29 IP:203.204.xxx.xxx 未訂閱
小弟知道原因了,但還是不知該如何解決。 就是在另一端的rs232以鮑率9600來接收即可正常, 但為何我設19200的鮑率傳輸卻要用9600的鮑率來接收呢?? 再麻煩各位大大了,thank you. 我是用root帳號登入的,執行程式前有先在終端機執行chmod a rw /dev/ttyS0。
sigmaccc
一般會員


發表:32
回覆:40
積分:14
註冊:2003-11-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-12-25 08:07:24 IP:203.204.xxx.xxx 未訂閱
後來我又發現一個現象,就是write(fp,SendData,sizeof(SendData)); 並沒有把資料送出去,而是等到close(fp);時。另一端的電腦才收到資料。 在close(fp);前有一行tcsetattr(fp,TCSANOW,&oldtio); // 回存舊的序列埠設定值。所以鮑率又被改回9600。 問題是write(fp,SendData,sizeof(SendData)); 為何無法將資料送出去,為 何要等到close(fp);才送呢? 此問題還是無解...
coolshou
一般會員


發表:0
回覆:1
積分:0
註冊:2003-05-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-12-25 13:02:01 IP:61.222.xxx.xxx 未訂閱
close才送出 小弟認為是資料量太少,系統先存在buffer中(有點像輸出到檔案一樣,在一定的資料量才會真正輸出,file有個指令強制輸出buffer中的資料),comport應該也有    不知道對不對
sigmaccc
一般會員


發表:32
回覆:40
積分:14
註冊:2003-11-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-01-08 13:59:57 IP:203.204.xxx.xxx 未訂閱
後來我改成 open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NONBLOCK) newtio.c_cc[VMIN] = 1; write();後面加 fsync(fp); // 將緩衝區資料寫回磁碟。 sync(); 但依然是要等到close()時,資料才會送至另一部電腦。 此問題搞了好久還是搞不定,麻煩有經驗的前輩指點了。 thanks.
piopoip
一般會員


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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-02-09 11:59:57 IP:218.168.xxx.xxx 未訂閱
請拿掉CRTSCTS屬性,應可立即收到
sigmaccc
一般會員


發表:32
回覆:40
積分:14
註冊:2003-11-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-02-10 16:47:31 IP:203.204.xxx.xxx 未訂閱
終於有人回答了...真是太感動了...鳴... 的確如piopoip大大所言,拿掉CRTSCTS屬性,即可收到。 但小弟用的是rs485,其中RTS腳必需自己寫程式控制ON/OFF, 看來看去好像只有CRTSCTS屬性可以控制RTS腳ON/OFF。 若關閉該屬性,rs485將無法連線。 so.. 問題還是存在,再麻煩各位大大了。
piopoip
一般會員


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-02-10 18:24:58 IP:211.23.xxx.xxx 未訂閱
我也曾遇過此問題(以485埠控制485Interface device), 我有三個解法.. 1.使用Auto RTS/CTS的chip,如..MOXA的485多埠卡皆有AUTO RTS功能 2.使用RS232埠,再串232-485轉換器,也不用控制RTS,當作232用 3.真的去控制RTS ON/OFF,我研究過兩天,但由於沒時間加上資質差,所以失敗... 爛方法,參考參考 如果有好方法,請回版面,謝謝
sigmaccc
一般會員


發表:32
回覆:40
積分:14
註冊:2003-11-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-02-11 08:45:59 IP:203.204.xxx.xxx 未訂閱
再次感謝piopoip大大提供之資訊。 可惜小弟公司用的485剛好就沒有AUTO RTS功能。且出貨量又已相當多。 不可能全面回收更改硬體。只能從軟體上下手。 目前也還在努力克服中...
sigmaccc
一般會員


發表:32
回覆:40
積分:14
註冊:2003-11-13

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-02-25 10:56:50 IP:220.130.xxx.xxx 未訂閱
我後來發現控制RTS的方法,但我實際使用在Kylix 3.0 C 中卻是失敗。 程式如下: ioctl (fp, TIOCMSET, &arg); /* get current state */ arg &= ~TIOCM_RTS; /* clear RTS */ ioctl (fp, TIOCMSET, &arg); /* do it */ arg |= TIOCM_RTS; /* set RTS */ ioctl (fp, TIOCMSET, &arg); /* do it */ 我發現在Kylix中只要一開檔open("/dev/ttyS0",O_RDWR|O_NOCTTY), RTS就自動ON,即使使用ioctl()也無法將它OFF。直到close(fp) RTS才會OFF。 這個問題已經問了一年多,但小弟能力有限,英文程度又不佳,始終無法解決。 再次麻煩前輩們幫幫忙了。thanks. 發表人 - sigmaccc 於 2005/02/25 10:59:47
sigmaccc
一般會員


發表:32
回覆:40
積分:14
註冊:2003-11-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-03-02 09:17:30 IP:220.130.xxx.xxx 未訂閱
引言: ioctl (fp, TIOCMSET, &arg); /* do it */
問題已經解決了,之前是因為少打&
系統時間:2024-11-21 17:07:40
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!