嵌入式linux串口設置(一)
在linux中,所有的設備文件一般都位于“/dev”下,串口1和串口2對應的設備名依次為“/dev/ttyS0”, “/dev/ttyS1”,而且USB轉串口的設備名通常為“/dev/ttyUSB0”,在linux下對設備的操作方法與對文件的操作方法一樣。
串口開發步驟:
串口的設置主要是設置struct termios結構體的各成員值
#include<termios>
struct termios
{
Unsigned short c_iflag; /*輸入模式標志*/
Unsigned short c_oflag; /*輸出模式標志*/
Unsigned short c_cflag; /*控制模式標志*/
Unsigned short c_lflag; /*本地模式標志*/
Unsigned char c_line ; /*線路規則*/
Unsigned char c_cc[NCC]; /*控制特性*/
Speed_t c_ispeed; /*輸入速度*/
Speed_t c_ospeed; /*輸出速度*/
};
串口設置包括波特率設置,檢驗位和停止位設置,主要設置的是c_cflag結構體成員,注意,不能直接對c_cflag成員初始化,而要將其通過與或操作。
int set_com_config(int fd,int baud_rate, int data_bits,char parity,int stop_bits)
{
struct termios new_cfg,old_cfg;
int speed;
/*保存并測試現有串口參數設置,在這里如果串口號等出錯,會有相關出錯信息*/
if(tcgetattr(fd,&old_cfg) != 0) /*該函數得到fd指向的終端配置參數,并將它們保存到old_cfg變量中,成功返回0,否則-1*/
{
perror("tcgetttr");
return -1;
}
/*設置字符大小*/
new_cfg=old_cfg;
cfmakeraw(&new_cfg); /*配置為原始模式*/
new_cfg.c_cflag &= ~CSIZE;/*用位掩碼清空數據位的設置*/
/*設置波特率*/
switch(baud_rate)
{
case 2400:
speed=B2400;
break;
case 4800:
speed=B4800;
break;
case 9600:
speed=B9600;
break;
case 19200:
speed=B19200;
break;
case 38400:
speed=B38400;
break;
default:
case 115200:
speed=B115200;
break;
}
cfsetispeed(&new_cfg,speed);
cfsetospeed(&new_cfg,speed);
/*設置停止位*/
switch(data_bits)
{
case 7:
new_cfg.c_cflag |= CS7;
break;
default:
case 8:
new_cfg.c_cflag |= CS8;
break;
}
/*設置奇偶校驗位*/
switch(parity)
{
default:
case 'n':
case 'N':
{
new_cfg.c_cflag &= ~PARENB;
new_cfg.c_iflag &= ~INPCK;
}
break;
case 'o':
case 'O':
{
new_cfg.c_cflag |= (PARODD | PARENB);
new_cfg.c_iflag |= INPCK;
}
break;
case 'e':
case 'E':
{
new_cfg.c_cflag |= PARENB;
new_cfg.c_cflag &= ~PARODD;
new_cfg.c_iflag |= INPCK;
}
break;
}
/*設置停止位*/
switch(stopbits)
{
default:
case 1:
new_cfg.c_cflag &= ~CSTOPB;
break;
case 2:
new_cfg.c_cflag |= CSTOPB;
break;
}
/*設置等待時間和最小接收字符*/
new_cfg.c_cc[VTIME]=0;
new_cfg.c_cc[VMIN]=1;
/*處理未接收字符*/
tcflush(fd,TCIFLUSH);
/*激活新配置*/
if((tcsetattr(fd,TCSANOW,&new_cfg))!=0)
{
perror("tcsetattr");
return -1;
}
return 0;
}
RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成