1. 程式人生 > >Linux-串列埠配置,初始化及使用

Linux-串列埠配置,初始化及使用

【檢視串列埠】
4412採用 ttySAC*系列串列埠裝置節點 ,即 ttySAC0 , ttySAC1 , ttySAC2 , ttySAC3


【開啟串列埠裝置節點】
“/dev/ttySAC3”
形成fd 與 裝置節點的/dev/ttySAC3連結


【初始化配置串列埠】
#include <termios.h>
#include <unistd.h>
struct termio {
unsigned short c_iflag;/* 輸入模式標誌 */
unsigned short c_oflag;/* 輸出模式標誌 */
unsigned short c_cflag;/* 控制模式標誌 */
unsigned short c_lflag;/* 本地模式標誌 */
unsigned char c_line;/* line discipline */
unsigned char c_cc[NCC];/* control characters */
};
int tcgetattr(int fd, struct termios *termios_p); //獲取fd所代表的串列埠的 termios 結構體值
int cfsetispeed(struct termios *termios_p, speed_t speed);
//設定termios_p B2400,B4800,B9600,B115200,B460800 


speed_t cfgetispeed(const struct termios *termios_p)
//獲取 termios_p 的波特率


int tcflush(int fd, int queue_selector);
/*清除串列埠中沒有完成輸入或輸出的資料
TCIFLUSH  清除正收到的資料,且不會讀取出來
TCOFLUSH  清除正寫入的資料,且不會發送至終端
TCIOFLUSH 清除所有正在發生的 I/O 資料*/


int tcsetattr(int fd, int optional_actions , const struct termios *new_termios_p);
/*配置 fd 所連結的串列埠
optional_actions : TCSANOW:  不等資料傳輸完畢就立即改變屬性
   TCSADRAIN:等待所有資料傳輸結束才改變屬性
                   TCSAFLUSH:清空輸入輸出緩衝區才改變屬性


new_termios_p : 新的串列埠配置資料,傳遞給 fd 所連結的串列埠 , 完成配置
*/


/*自定義串列埠配置函式*/
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
struct termios newtio,oldtio;
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 )
{
case 7:
newtio.c_cflag |= CS7;
break;
case 8:
newtio.c_cflag |= CS8;
break;
}
    
//奇偶校驗
switch( nEvent )
{
case 'O':
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
break;
case 'E': 
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N':  
newtio.c_cflag &= ~PARENB;
break;
}


//波特率
switch( nSpeed )
{
case 2400:
cfsetispeed(&newtio, B2400);
cfsetospeed(&newtio, B2400);
break;
case 4800:
cfsetispeed(&newtio, B4800);
cfsetospeed(&newtio, B4800);
break;
case 9600:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
case 115200:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
case 460800:
cfsetispeed(&newtio, B460800);
cfsetospeed(&newtio, B460800);
break;
default:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
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("com set error");
return -1;
}

//配置完成
printf("set done!\n\r");
return 0;
}




【串列埠收發】
/*發-write*/
char *buffer = "which you want to send";
fd = open("/dev/ttySAC3" , O_RDWR|O_NOCTTY|O_NDELAY)
write(fd,buffer, strlen(buffer));


/*收-read*/
char buffer[512];
nByte = read(fd, buffer, 512);
nByte返回所讀位元組數