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

看板C_and_CPP (C/C++)作者 (尼莫)時間12年前 (2013/12/31 15:04), 編輯推噓2(206)
留言8則, 4人參與, 最新討論串1/1
※ [本文轉錄自 LinuxDev 看板 #1ImcLpA8 ] 作者: nec716 (尼莫) 看板: LinuxDev 標題: [問題] RS232 傳輸不穩定 時間: Tue Dec 31 14:34:22 2013 最近在嘗試使用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; 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); 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呢 問題有點多 在這邊先謝謝各位前輩了╭(─╴╴─)╮ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.171.189 ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: nec716 (114.32.171.189), 時間: 12/31/2013 15:04:16

12/31 17:25, , 1F
我自己3年前的記憶是 USB to RS232裝置的問題
12/31 17:25, 1F

12/31 17:27, , 2F
有的牌子會掉資料(資料錯亂) 可是有的就很正常
12/31 17:27, 2F

12/31 17:28, , 3F
可是我也沒有去記是哪個牌子OK就是了(BTW 那時我OS是WinXP)
12/31 17:28, 3F

12/31 17:30, , 4F
另外我那時候發生資料錯亂時 把BaudRate降低就正常(19200-)
12/31 17:30, 4F

12/31 23:12, , 5F
有沒有示波器? 直接把硬體訊號拉出來看看常常會有意外的發現
12/31 23:12, 5F

12/31 23:12, , 6F
將正常的和有問題的比較一下吧
12/31 23:12, 6F

01/02 09:09, , 7F
謝謝各位的建議 我再研究看看
01/02 09:09, 7F

01/02 22:34, , 8F
記得選用雙隔離線
01/02 22:34, 8F
文章代碼(AID): #1ImcnoYr (C_and_CPP)
文章代碼(AID): #1ImcnoYr (C_and_CPP)