对串口的操作一般分为四步:打开串口、设置串口、读写串口和关闭串口。Linux下,可以通过设备文件访问串口只需要open()相应的设备文件即可。
串口的设备文件名:
1.直接连接的串口,串口的设备文件为/dev/ttyS0、/dev/ttyS1等等,S0对应串口1,以此类推。
2.通过USB转串口连接,设备文件为/dev/ttyUSB0
$dmesg|grep ttyS* 命令可以显示系统串口拔插信息。
需要注意的是,普通用户不能打开设备文件。可以提升shell的权限$sudo -s,这样就使shell拥有了超级权限。$sudo su username 可以退回普通权限。
打开串口:
{
int fd = open( Dev, O_RDWR );
if (-1 == fd)
{
perror("Can't Open Serial Port");
return -1;
}
else
return fd;
}
设置串口:设置串口的关键在于termios结构体的设置。termios的详细文档在这个链接。
termios函数族提供了一个常规的终端接口,用于控制非同步通信端口。这个结构体包含了至少下列成员:
tcflag_t c_iflag; /* 输入模式 */
tcflag_t c_oflag; /* 输出模式 */
tcflag_t c_cflag; /* 控制模式 */
tcflag_t c_lflag; /* 本地模式 */
cc_t c_cc[NCCS]; /* 控制字符 */
设置串口通信速率:
/* 设置串口通信速率
fd 类型 int 打开串口的文件句柄
speed 类型 int 串口速度
*/
int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300,
38400, 19200, 9600, 4800, 2400, 1200, 300, };
void set_speed(int fd, int speed)
{
int i;
int status;
struct termios Opt;
tcgetattr(fd, &Opt);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
{
if (speed