[問題] RS232 傳輸不穩定

作者: nec716 (尼莫)   2013-12-31 14:34:22
最近在嘗試使用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呢
問題有點多 在這邊先謝謝各位前輩了╭(─╴╴─)╮
作者: mayasky ( )   2012-01-05 14:11:00
個人經驗這種線好壞差很多,別省小錢以前DEBUG半天換條線啥事都沒有,先確定線是OK的
作者: askacis (ASKA)   2012-01-06 08:23:00
usb轉rs232的還是FTDI的晶片比較穩定

Links booklink

Contact Us: admin [ a t ] ucptt.com