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

【查看串口】
4412采用 ttySAC*系列串口设备节点 ,即 ttySAC0 , ttySAC1 , ttySAC2 , ttySAC3


【打开串口设备节点】
“/dev/ttySAC3”
形成fd 与 设备节点的/dev/ttySAC3链接


【初始化配置串口】
#include
#include
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返回所读字节数

你可能感兴趣的:(Linux-串口配置,初始化及使用)