用CSerialPort類收不到0x11, 0x13問題及解決辦法

在VS2010平臺下編寫modbusRTU程序,在調試的時候發現CSerialPort串口類無法接收到0x11, 0x13,隨後百度找的一篇Linux下的文章,大受啓發,原文如下:

linux串口接收不到0x11解決
 
網上許多流行的linux串口編程的版本中都沒對c_iflag(termios成員變量)這個變量進行有效的設置,這樣傳送ASCII碼時沒什麼問題,但傳送二進制數據時遇到0x0d,0x11和0x13卻會被丟掉。不用說也知道,這幾個肯定是特殊字符,被用作特殊控制了。關掉ICRNL和IXON選項即可解決。
  www.2cto.com  
       c_iflag &= ~(ICRNL | IXON);
0x0d 回車符CR
0x11 ^Q VSTART字符
0x13 ^S VSTOP字符
ICRNL 將輸入的CR轉換爲NL  
IXON 使起動/停止輸出控制流起作用
 
在《UNIX環境高級編程第二版》第18章第11小節看到把終端I/O設置爲原始模式(串口通訊就是終端I/O的原始模式)時輸入屬性設置爲
term.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
屏蔽了許多屬性,怪不得有人說如果是使用串口通訊c_iflag和c_oflag都設置爲0就行了!  www.2cto.com  
 
以下是我的設置的一些重要的串口屬性
term.c_cflag |= CLOCAL | CREAD;
term.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
term.c_oflag &= ~OPOST;
term.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
http://www.2cto.com/os/201302/189931.html


我在VS2010工程裏打開串口方法裏做如下配置即可,不知道還會不會再有問題

//m_Serial 爲 CSerialPort的對象
m_Serial.Open(info->comPort, info->comBand, CSerialPort::NoParity, 8,
CSerialPort::OneStopBit, CSerialPort::NoFlowControl);



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章