全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2906
推到 Plurk!
推到 Facebook!

設定Serial port的parity

缺席
GGL
資深會員


發表:104
回覆:600
積分:335
註冊:2006-11-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-01-24 17:23:08 IP:219.87.xxx.xxx 訂閱
承接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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-01-30 13:34:39 IP:219.87.xxx.xxx 訂閱
前天解決了這個問題,原來是設定有誤

如果以raw data的方式數值就正確了
系統時間:2024-04-28 12:01:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!