設定Serial port的parity |
缺席
|
GGL
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
承接http://delphi.ktop.com.tw/board.php?cid=173&fid=1167&tid=92143 (Linux 系統A透過RS232寫入資料到機器B) ---- Linux C
唯有在Set_Serial(fd,38400,8,'E',1),也就是Baud Rate = 38400, Parity = even, Stop Bit = 1,程式才有辦法寫入資料到機器中 在這個情況下,即使系統A不傳送任何訊息給機器B,機器B仍然會依照出廠的設定送出資料給系統A(持續不斷的傳送),得到的數值集合暫時稱為Set Even 若Set_Serial(fd,38400,8,'O',1),也就是Baud Rate = 38400, Parity = no parity, Stop Bit = 1 同樣,系統A不傳送任何訊息給機器B,機器B依照出廠的設定送出資料給系統A(持續不斷的傳送),得到的數值集合暫時稱為Set No 這兩個集合有很大的差異,實際上,Set No是正確的;但是這個設定下,系統A無法送出資料給機器B 嘗試許多種組合,還是沒辦法取得跟no parity一樣的數值。請問這是什麼原因?是因為傳送的過程出現error bit 嗎?有什麼方法可以讓數值正確? 另一點讓我有點疑惑的是,為什麼說明書上寫Baud Rate = 38400 or 19200、parity = even, odd, no parity,卻只有其中一種組合可以傳送資料給機器B? 難道說明書是錯誤的嗎? 這應該是不太可能吧! 煩請大大幫我解答疑惑,在網路上找了一整天,找到許多設定even parity的方法,就是沒有一個的結果跟no parity一樣或相差不遠的。 ps. 傳回的結果包含兩種數值,壓力及流量,並畫成波形圖 在下面程式中,若even的ISTRIP(去除驗證位元)拿掉,流量數值大致上是正確的,因為正常情況波形應該是周期性的在-50~ 50之間,但是若不拿掉,則數值會介於0~10之間,差異蠻大的;因此,我一直嘗試修改參數,還是沒辦法得到一個正確的結果。 請幫我指引個方向 [code cpp] int OpenSerial() { struct termios oldtio, newtio; // 開啟數據機裝置以讀取並寫入而不以控制 tty 的模式; 因為不想程式在送出 CTRL-C 後就被殺掉 fd = open (MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd < 0) { perror (MODEMDEVICE); exit (-1); } else fcntl(fd, F_SETFL, 0); tcgetattr (fd, &oldtio); // 儲存目前的序列埠設定 memset(&newtio,0, sizeof (newtio)); // 清除結構體以放入新的序列埠設定值 if(fcntl(fd, F_SETFL, 0)<0) printf("fcntl failed!\n"); if(isatty(STDIN_FILENO)==0) printf("standard input is not a terminal device\n"); return fd; } //---------------------------------------------------------------- int Set_Serial(int fd,int nSpeed, int nBits, char nEvent, int nStop) { struct termios newtio,oldtio; int status; if( tcgetattr( fd,&oldtio) != 0) { perror("SetupSerial 1"); return -1; } bzero( &newtio, sizeof( newtio ) ); newtio.c_cflag |= CLOCAL | CREAD; newtio.c_cflag &= ~CSIZE; switch( nBits ) //設定Data Bits { case 7: newtio.c_cflag |= CS7; break; case 8: newtio.c_cflag |= CS8; break; } switch( nEvent ) //設定parity { case 'O': //Odd newtio.c_cflag |= PARENB; newtio.c_cflag |= PARODD; newtio.c_iflag |= (INPCK | ISTRIP); break; case 'E': //Even newtio.c_iflag |= (INPCK | ISTRIP); newtio.c_cflag |= PARENB; newtio.c_cflag &= ~PARODD; break; case 'N': //No Parity newtio.c_cflag &= ~PARENB; break; } switch( nSpeed ) //設定Baud Rate { case 19200: cfsetispeed(&newtio, B9600); cfsetospeed(&newtio, B9600); break; case 38400: cfsetispeed(&newtio, B38400); cfsetospeed(&newtio, B38400); break; } if( nStop == 1 ) newtio.c_cflag &= ~CSTOPB; else if( nStop == 2 ) newtio.c_cflag |= CSTOPB; newtio.c_cc[VTIME] = 0; newtio.c_cc[VMIN] = 0; tcflush(fd,TCIFLUSH); if((tcsetattr(fd,TCSANOW,&newtio))!=0) { perror("Set serial port error.\n"); return -1; } ioctl(fd, TIOCMGET, &status); /* get the serial port status */ status &= ~TIOCM_DTR; status &= ~TIOCM_RTS; ioctl(fd, TIOCMSET, &status); /* set the serial port status */ return 0; } [/code] |
GGL
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:104 回覆:600 積分:335 註冊:2006-11-05 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |