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

作者: doug919 (達)   2013-12-31 23:47:26
※ 引述《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
看不懂的可以再問我看看
作者: nec716 (尼莫)   2012-01-02 09:11:00
感謝d大提供的網頁 我先研究看看

Links booklink

Contact Us: admin [ a t ] ucptt.com