Re: [問題] RS232 傳輸不穩定

看板LinuxDev作者 (達)時間11年前 (2013/12/31 23:47), 編輯推噓0(001)
留言1則, 1人參與, 最新討論串2/2 (看更多)
※ 引述《nec716 (尼莫)》之銘言: : 最近在嘗試使用RS232 發送指令與設備溝通 : 找了一些網路上的範例與資料 : 並且利用兩條 "USB 轉 RS232"溝通兩個VM : 使用cutecom 來檢查發送結果 : 程式目前已經擁有發送指令的功能 : 但是在傳送上會有不太穩定的狀況 : 測試的角色與環境有以下幾種 : 1. main.cpp (VMplayer with Ubuntu 13.10) VM_A : 2. cutecom (VMplayer with Ubuntu 13.10) VM_A : 3. cutecom (VMplayer with Ubuntu 13.10) VM_B : 4. 廠商的測試程式 (Win 8.1) : 5. 欲溝通的設備 : 目前 2 3 4 5 之間的相互溝通都沒有問題 : 但是使用我寫出來的程式(1) 則有時候會失敗 : 接收端會接收不到資料 : 當1發生失敗後 再使用2便無法與 3 4 5溝通 : 必須拔除USB後 甚至將VM重開2 才能正常與 3 4 5溝通 : 因此猜測是否是程式流程上 或是 設定上有什麼問題 : 麻煩各位前輩幫我看看 : 程式碼如下 : int main() : { : string s = "10 02 00 01 01 01 00 00 00 00 00 00 00 00 00 00 00 00 10 03 02 "; : string cmdStr; : clearStrSpace(&s, &cmdStr); : if (!cmdCheck(&cmdStr)) : exit(-1); : unsigned char *hexCmd = new unsigned char[cmdStr.length()+1]; : strToHexCmd(&cmdStr, hexCmd, cmdStr.length()); : //以上為字串處理 將字串轉為hex 處理結果存於hexCmd中 : int fp, res; : struct termios oldtio,newtio; : fp=open(MODEMDEVICE ,O_RDWR|O_NDELAY|O_NOCTTY); : if (fp <0) { perror (MODEMDEVICE); exit(-1);} : tcgetattr(fp,&oldtio); // 儲存目前的序列埠設定。 : bzero(&newtio, sizeof(newtio)); // 清除結構體以放入新的序列埠設定值。 : newtio.c_cflag=BAUDRATE | CS8 | CLOCAL | CREAD; 加上CRTSCTS 或是 CNEW_RTSCTS看看 這是設定hardware flow control 有的硬體不支援或是丟太快仍有可能會掉資料 屆時你可以在研究一下software flow control : newtio.c_iflag = 0; : newtio.c_oflag = 0; : newtio.c_lflag = 0; : newtio.c_cc[VTIME] = 0; : newtio.c_cc[VMIN] = 0; : tcflush(fp,TCIOFLUSH); // 清除發送緩衝區的資料 : tcsetattr(fp,TCSANOW,&newtio); // 啟動序列埠的設定。 : unsigned char buf[2]; : for(int i = 0; i < cmdStr.length()/2; i++) : { : buf[0] = hexCmd[i]; : res += write(fp, buf, 1); write的時候確認回傳值是否真的寫下去了 如果回傳0沒寫不下去 因為chip或driver buffer滿了 要多等晚點再寫 另外建議你一次寫多一點 不要這樣間隔1us寫 速度理論上還是靠硬體跟driver控制 你可以寫到write回傳比參數三 小的時候就小睡一下 or others : usleep(1); : } : cout << "Res =" << res << endl; : tcsetattr(fp,TCSANOW,&oldtio); // 回存舊的序列埠設定值 : close(fp); // 關閉MODEMDEVICE : cout << "Done" << endl; : return 0; : } : 以上麻煩各位前輩幫我看看 : 程式流程 或是 設定上有什麼問題 : 另外 在網路上的程式碼中 : 我發現有些程式這兩個動作 : tcsetattr(fp,TCSANOW,&oldtio); : close(fp); : 有些是先做close 才回復設定 : 有疑問的地方在於 fp做了close之後 : 不是應該沒有意義了嗎 : 為什麼還能夠做tcsetattr呢 fclose後做確實是不太正確的 沒有file handle理論上設不到driver : 問題有點多 在這邊先謝謝各位前輩了╭(─╴╴─)╮ 設定細節可以參考 http://digilander.libero.it/robang/rubrica/serial.htm#3_1_1 看不懂的可以再問我看看 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.73.68

01/02 09:11, , 1F
感謝d大提供的網頁 我先研究看看
01/02 09:11, 1F
文章代碼(AID): #1ImkSHsK (LinuxDev)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1ImkSHsK (LinuxDev)